Seite 1 von 1

SQL - Abfrage

Verfasst: Mi 16.Nov, 2005 10:52
von diegoriv
Hab eben die Krise, weil ich keine vernünftige Erklärung zu einer sql-Abfrage finden kann.

folgender Teil steht im code (cal_view_new.php vom calpro)

Code: Alles auswählen

....
WHERE c.valid = 'yes' AND c.r_type != 'D' AND ";
Ich hätte da gerne ein LIMIT X eingeführt, aber das geht genau nicht.

1) Was macht das AND am Ende der Zeile, wenn nichts mehr kommt. (Ohne gibts ne Fehlermeldung)?
2) Wie bau ich da ein Limit ein?

Vielen Dank

Verfasst: Mi 16.Nov, 2005 12:22
von oxpus
Poste doch mal mehr als nur diese eine Zeile.
Der Kalender baut schliesslich die meisten Abfragen in mehrern Blöcken zusammen und da kommt auch irgendwann die Stelle, wo man ein LIMIT einsetzen kann.

Verfasst: Mi 16.Nov, 2005 12:41
von diegoriv
dann also der ganze block

Code: Alles auswählen

$sql = "SELECT *, c.event_start FROM ".CAL_TABLE." AS c
	LEFT JOIN ".CAL_RECUR." AS r ON c.r_group_id = r.r_group_id
	LEFT JOIN ".CAL_CATS." AS cat ON c.category = cat.cat_id
	LEFT JOIN ".CAL_GROUP_EVENT." AS ge ON c.id = ge.event_id
	LEFT JOIN ".USERS_TABLE." AS u ON u.user_id = c.user_id
WHERE c.valid = 'yes' AND c.r_type != 'D' AND ";

Verfasst: Mi 16.Nov, 2005 12:45
von oxpus
DANACH, nicht davor. Das LIMIT wird nach erst anschliessend eingebaut.
Also so 15-20 Zeilen danach mal posten...

Verfasst: Mi 16.Nov, 2005 13:30
von diegoriv
jetzt kapier ich das *lichtaufgeh*. es kommen irgendwo später noch weitere anweisungen. frage 1 ist damit hinfällig. hier der ganze block- ich hoffe, das reicht

Code: Alles auswählen

// MOD group specific and private events - start
$sql = "SELECT *, c.event_start FROM ".CAL_TABLE." AS c
	LEFT JOIN ".CAL_RECUR." AS r ON c.r_group_id = r.r_group_id
	LEFT JOIN ".CAL_CATS." AS cat ON c.category = cat.cat_id
	LEFT JOIN ".CAL_GROUP_EVENT." AS ge ON c.id = ge.event_id
	LEFT JOIN ".USERS_TABLE." AS u ON u.user_id = c.user_id
	WHERE c.valid = 'yes' AND c.r_type != 'D' AND ";
	
if(isset($groups[0])) {
	// If the user is member of 1+ usegroups then check for these results too.
	while(list(,$group) = each($groups)) {
		if(count($groups > 1) && isset($sql_groups)) {
			 $sql_groups .= " OR ";
		}
		$sql_groups .= "ge.group_id = ".$group['group_id'];
	}
	$sql_access = '(c.event_access = 2 AND ('.$sql_groups.' OR ge.group_id IS NULL OR ge.group_id = 0))';
}
$sql_access .= ($groups && $cal_config['allow_private']) ? ' OR ' : '';
if($cal_config['allow_private']) {
	$sql_access .= ' (c.event_access = 1 AND c.user_id = '.$userdata['user_id'].') ';
}
$sql .= ($sql_access) ? '('.$sql_access.' OR c.event_access = 0)  AND ' : 'c.event_access = 0 AND ';
// MOD end


if ($id) {
	$sql .= " id = '$id'";
}
else {
// MOD Null time/stable date fix
	if($board_config['board_timezone'] < 12) {
		$sql .= " c.event_start > $this_date_unix ";
	}
	else {
		$time_adjust = 12 * 60 * 60;
		$sql .= " ((c.event_start >= '$this_date_unix' AND event_time_set >= 1)
			OR (c.event_start >= '". ($this_date_unix + $time_adjust) ."' AND event_time_set = 0)) ";
	}
	$sql .= "ORDER BY c.event_start";
}


$time_adjust = ($board_config['board_timezone'] >= 12) ? (12 * 60 * 60) : 0;
// MOD end

Verfasst: Mi 16.Nov, 2005 17:11
von oxpus
Und hier vor:

Code: Alles auswählen

$time_adjust = ($board_config['board_timezone'] >= 12) ? (12 * 60 * 60) : 0; 
noch ein

Code: Alles auswählen

$sql .= 'LIMIT X, Y';
und das Ziel wäre erreicht ;)

Okay, X und Y natürlich mit sinnvollen Werten füllen, wobei X der Start und Y die Anzahl der Datensätze wären...

Verfasst: Do 17.Nov, 2005 12:10
von diegoriv
leider ist das ziel damit nicht erreicht:

eingebaut so

Code: Alles auswählen

	$sql .= "ORDER BY c.event_start";
}
$sql .= 'LIMIT 1, 3';

$time_adjust = ($board_config['board_timezone'] >= 12) ? (12 * 60 * 60) : 0;
ergibt:
Could not select Event data

DEBUG MODE

SQL Error : 1064 You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '1, 3' at line 6

Verfasst: Do 17.Nov, 2005 12:58
von oxpus
Ein Leerzeichen vor "LIMIT" wäre hier nicht übel ;)

Verfasst: Do 17.Nov, 2005 14:04
von diegoriv
Bin ich jetzt schon völlig bescheuert???

1) Ich hab die Zeile aus deinem Posting kopiert
2) Ich hab jetzt versucht an allen möglichen und unmöglichen Stellen Leerzeichen einzufügen - kein Erfolg

??? :confused: :confused: :wall:

Verfasst: Do 17.Nov, 2005 15:35
von oxpus
Direkt vor LIMIT, also so:

Code: Alles auswählen

$sql .= ' LIMIT 1, 3';

Verfasst: Do 17.Nov, 2005 18:55
von diegoriv
Aaaaaaaasoooo *lichtaufgeh*

jetzt begreif ich auch die logik hinter dem system. ist ja eigentlich völlig klar.

*aufdiebirneklatsch*

Vielen liebe Danke

Verfasst: Do 17.Nov, 2005 20:52
von oxpus
Jo, keine Ursache.
Manchmal brauchst halt einen kleinen Schubser ;)