Zuviele MySQL-Abfragen?

suntrop

Erfahrenes Mitglied
Hallo.
Ich lasse aus einer Kundenliste ID, Name, E-Mail und Produkt ausgeben. Zusätzlich lasse ich, je nach Käuferstatus die Zeilenhintergrundfarbe grün oder blau ausgeben. Allerdings steht der Status in einer Zweiten Tabelle und so muss ich für jede Zeile eine neue MySQL-Anfrage senden, was bei einer Liste von ein paar Hundert Kunden (meiner Meinung nach) sehr viele Queries sind.

Kann ich das irgendwie vermeiden oder die Abfrage effizienter machen? Keine Ahung wie, aber ich Frage mal nach ;)
Oder ist es vielleicht üblich, auch sehr viele Abfragen zu senden?

Hier mal ein Auszug aus der Datei
PHP:
echo "</thead>\n";
while($row = mysql_fetch_assoc($rs))
{
      ....
	echo "<td".status($row['id']).">".$row["id"]."</td>\n";
      ....
}
echo "</table>\n";
PHP:
function status($id)
{
	// Status aus Tabelle info lesen
	$sqlInfo_s = "SELECT status FROM info WHERE uid='$id'";
	$rs = mysql_query($sqlInfo_s);
	$count = mysql_num_rows($rs);
	if (!$count) {
		return ' style=""';
	} else {
		$st = mysql_fetch_assoc($rs);
		
		if ($st[status] == '') {
			return ' style="x"';
		} else if ($st[status] == '0') {
			return ' style="background-color:blue;"';
		} else if ($st[status] == '1') {
			return ' style="background-color:green;"';
		} else {
			return ' class=""';
		}
	}
}
Für jeden Durchlauf der While-Schleife wird eine Anfrage für den Status gesendet. Ich finde das nicht gerade sparsam :)
 
Hiho,

dazu gibt es bei Mysql sogenannte Joins.
Hier kannst du nun zb ergebnisse übermehrere tabelle verknüpfen.

WICHTIG! hierbei ist allerdings.
Das in der eigentlichen Tabelle oder der Zieltabelle ein Attribut enthalten ist, auf welches mal referenzieren kann.

zb bei dir die 'uid'

eine Abfrage könnte so aussehen:
PHP:
SELECT 
    u.uid ID,
    u.name Name,
    u.mail eMail,
    u.product Produkt,
    s.status Status
FROM
    user u
LEFT JOIN
    status s
USING (uid)

nun bekommst du alle Daten aus deiner Usertabelle:
ID, Name, eMail, Produkt, Status

wichtig ist hierbei das uid in deiner Usertabelle genauso heisst wie in deiner Status tabelle.

andere möglichkeit wäre einfach ein script, was abwechselnd die farben anzeigt.

PHP:
echo "</thead>\n";
$i = 0;
while($row = mysql_fetch_assoc($rs))
{
      ....
    echo "<td".getRowColor($i).">".$row["id"]."</td>\n";
      ....
    ++$i;
}
echo "</table>\n";  

function getRowColor($i)
{
    if($i%2 == 0)
        return ".... dein blau code ....";
    else
        return ".... dein grau code ....";
}

je nachdem was schöner für dich ist :)
 
Hallo Nexi. Danke für deine Antwort!

:-( Die Antwort: dafür sind JOINS zuständig, hatte ich vor einigen Wochen bereits an anderer Stelle vor einigen Wochen. Habe es aber anscheinend nicht ganz verstanden, wie die Dinger tatsächlich funktionieren. Ich muss mir das mal in einem gesonderten Tutorial ausführlich ansehen. Scheinen nützlich zu sein :)

Besten Dank für deine Hilfe.

Grüße
suntrop
 
Habe da noch eine Nachfrage.

Wie komme ich an die Daten Vorname, Name etc. ran? Die stehen nicht in meinem "gefetchten" Array, dort habe ich nur den Status und die ID.

PHP:
$sql = '
	SELECT 
		t1.id ID,
		t1.first_name Vorname,
		t1.last_name Nachname,
		t1.email email,
		t2.uid UID,
		t2.status Status
	FROM
		tabelle2 t2
	LEFT JOIN
		tabelle1 t1
	USING (id)
	WHERE status="1"';

Ich möchte neben dem Status auch den Vor-Nachname ausgeben. Aber mein verstricktes SQL oben gibt mir nicht die Namen aus.
 
Wenn ich das richtig sehe, kommen deine Grunddaten aus tabelle1 (vorname, nachname etc)

dann solltest du dort drauf deinen select machen.
ich nehme mal an deine angaben entsprechen dem aktuellen aufbau deiner datenbank

dann müsse das folgendermaßen aussehen:

PHP:
$sql = '
    SELECT 
        t1.id ID,
        t1.first_name Vorname,
        t1.last_name Nachname,
        t1.email email,
        t2.uid UID,
        t2.status Status
    FROM
        tabelle1 t1
    LEFT JOIN
        tabelle2 t2
    ON t1.id = t2.uid';

so würdest du alle datensätze aktuell erhalten.

um es genau zu erklären:
Zu selektierst von tabelle1 (t1) id, first_name, last_name, email mit dem jeweiligen Alias (über welchen du dann auch im result, darauf zugreifst)

desweiteren suchst du für jeden eintrag in t1 einen eintrag in t2 bei welchem die aktuelle t1.id gleich der t2.uid ist, wenn dem so ist, werden t2.uid und t2.status mit dem jeweiligem Alias ausgelesen, welche dann auch wieder im Result über genau diesen ansprechbar sind.

sollte natürlich kein weitere passender datensatz gefunden worden sein, so ist Status und UID eben leer (bzw null).
 
Zurück