Left Join - Wie?
Ich bekomme, dieses LEFT JOIN Überprüfung einfach nicht hin. Und zwar soll es eine Suche sein, die aber auch überprüft ob die ID in einer 2. Tabelle vorhanden ist.
Tabelle 1:
Dann suche ich mal...
So weit so gut, wären jetzt 3 Treffer. ABER es gibt noch eine Zweite Tabelle, wo die ID von der ersten mindestens 1 mal vorkommen soll:
In diesem Fall ist ID 1 (Grünes Schwert) von der ersten Tabelle 2 mal in der 2. vorhanden & soll wieder gegeben werden.
ID 1 (Rotes Schwert) von der ersten Tabelle 1 mal in der 2. vorhanden & soll wieder gegeben werden.
Aber ID 3 (Blaues Schwert) ist zwar in der ersten Tabelle vorhanden, aber existiert nicht in der 2. und soll somit nicht mit gewählt werden.
So, ich hoffe es ist verständlich und mir kann hier einer helfen.
Bis jetzt war so weit Alles erfolglos, wie zum Beispiel:
Die letzte Zeile muss da denke ich mal falsch sein, denn es wird wenn ein Item in der 2.DB 20 mal vorkommt auch später 20 mal wieder gegeben.
Habe es schon hin bekommen, HAVING war mir völlig Fremd & funktioniert aber, der fertige Code:
So, weiß einer wie ich nun mit COUNT zählen kann, wie oft das Item in Tabelle 1 vorkommt (unter diesen Bedingungen?)
Tabelle 1:
|
|
Quellcode |
1 2 3 4 |
ID VALUE 1 Grünes Schwert 2 Rotes Schwert 3 Blaues Schwert |
Dann suche ich mal...
|
|
Quellcode |
1 2 |
$search = 'Schwert'; SELECT * FROM 'Tabelle 1' WHERE VALUE LIKE '%.$search.%' |
So weit so gut, wären jetzt 3 Treffer. ABER es gibt noch eine Zweite Tabelle, wo die ID von der ersten mindestens 1 mal vorkommen soll:
|
|
Quellcode |
1 2 3 4 |
ID2 ID_von_TB1 1 1 2 1 3 2 |
In diesem Fall ist ID 1 (Grünes Schwert) von der ersten Tabelle 2 mal in der 2. vorhanden & soll wieder gegeben werden.
ID 1 (Rotes Schwert) von der ersten Tabelle 1 mal in der 2. vorhanden & soll wieder gegeben werden.
Aber ID 3 (Blaues Schwert) ist zwar in der ersten Tabelle vorhanden, aber existiert nicht in der 2. und soll somit nicht mit gewählt werden.
So, ich hoffe es ist verständlich und mir kann hier einer helfen.
Bis jetzt war so weit Alles erfolglos, wie zum Beispiel:
|
|
MySQL-Abfrage(n) |
1 2 3 4 |
SELECT VALUE FROM ".tabelle1." LEFT JOIN ".tabelle2." ON ".tabelle2.".ID_von_TB1=".tabelle1.".id WHERE ".tabelle1.".VALUE LIKE '%".$search."%' AND ".tabelle2.".ID_von_TB1=".tabelle1.".id |
Die letzte Zeile muss da denke ich mal falsch sein, denn es wird wenn ein Item in der 2.DB 20 mal vorkommt auch später 20 mal wieder gegeben.
Habe es schon hin bekommen, HAVING war mir völlig Fremd & funktioniert aber, der fertige Code:
|
|
MySQL-Abfrage(n) |
1 2 3 4 5 6 |
SELECT VALUE FROM ".tabelle1." LEFT JOIN ".tabelle2." ON ".tabelle2.".ID_von_TB1=".tabelle1.".id WHERE ".tabelle1.".VALUE LIKE '%".$search."%' GROUP BY ".tabelle1.".id HAVING count(".tabelle2.".ID_von_TB1) > 0 AND ".tabelle2.".ID_von_TB1=".tabelle1.".id |
So, weiß einer wie ich nun mit COUNT zählen kann, wie oft das Item in Tabelle 1 vorkommt (unter diesen Bedingungen?)
Es geht nicht darum zu haben was man will, sondern zu schätzen was man hat!
Blutrausch HP
Mauern sind auch nur Steine & Wassertropen können auch mal Wassermengen werden!
Blutrausch HP
Mauern sind auch nur Steine & Wassertropen können auch mal Wassermengen werden!
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Muetze« (28. Oktober 2010, 16:50)
So mach ich das allerdings brauchte ich in meiner Abfrage das Having nicht.
Müsste aber auch ohne while gehen nur ich brauchte die halt wegen dem array um zb:
so zu arbeiten
|
|
PHP-Quelltext |
1 2 3 4 5 6 7 8 9 |
//--> Geschlechtsstatistik
$count_sex = $SQL->query("SELECT user_sex, COUNT(user_sex) AS counter FROM ".pkSQLTAB_CASTING_USER." LEFT JOIN ".pkSQLTAB_USER." ON ".pkSQLTAB_CASTING_USER.".user_id = ".pkSQLTAB_USER.".user_id GROUP BY user_sex ORDER BY user_sex");
while($sex = $SQL->fetch_array($count_sex))
{
//--> Wert in von array in Variable setzen
$data[$sex['user_sex']] = $sex['counter'];
#echo "<pre>" .print_r( $data, true ). "</pre>";
}
|
Müsste aber auch ohne while gehen nur ich brauchte die halt wegen dem array um zb:
|
|
PHP-Quelltext |
1 2 3 4 |
//--> Angaben in Prozent
$w_prozent = round($data['w'] * 100 / $counter[0]);
$m_prozent = round($data['m'] * 100 / $counter[0]);
$n_prozent = round($data['d'] * 100 / $counter[0]);
|
so zu arbeiten
OffTopic
Weil wir grad bei neuen Sachen sind, geb ich dir auch mal das Schlagwort " WHERE IN('value1','value2')". Kannte ich bis vor kurzen auch nicht aber finde es klasse weil man sich so Schreibarbeit erspart
Weil wir grad bei neuen Sachen sind, geb ich dir auch mal das Schlagwort " WHERE IN('value1','value2')". Kannte ich bis vor kurzen auch nicht aber finde es klasse weil man sich so Schreibarbeit erspart
Seit 02.07.2010 Papa einer süssen Tocher !!!!
http://www.burnerfm.de
Mit den besten Hits der 80´s, 90´s und von heute. Plus einigen PHPKit Addons... uvm.
Mit den besten Hits der 80´s, 90´s und von heute. Plus einigen PHPKit Addons... uvm.
Werde es morgen mal ausprobieren, aber ich habe schon festgestellt, das LEFT JOIN bei Tabelle 1 mit 45.000 Einträgen & Tabelle 2 mit 180.000 Einträge eh von der Geschwindigkeit ist katastrophal ist.
Es geht nicht darum zu haben was man will, sondern zu schätzen was man hat!
Blutrausch HP
Mauern sind auch nur Steine & Wassertropen können auch mal Wassermengen werden!
Blutrausch HP
Mauern sind auch nur Steine & Wassertropen können auch mal Wassermengen werden!
Also wenn ich das jetzt richtig verstanden habe, und ich muss sagen, dass war in deinem ersten Satz echt schwer, dann sollen nur Ergebnisse erscheinen, die auch in allen Tabellen Vorhanden sind?!?! Richtig?
Würde ich jetzt an dem Satz fest machen: Aber ID 3 (Blaues Schwert) ist zwar in der ersten Tabelle vorhanden, aber existiert nicht in der 2. und soll somit nicht mit gewählt werden.
Dann wäre hier statt LEFT JOIN nur JOIN zu nehmen. Warum? Weil JOIN wesentlich schneller arbeitet und LEFT JOIN immer ein NULL zurück liefert, wenn kein Wert vorhanden ist. Das macht JOIN nicht. Sollte die Abfrage zu langsam werten, setze vor deine Abfrage einfach mal ein EXPLAIN und kopiere sie am besten in phpMyAdmin. Damit erhältst du anschließend eine Ausgabe und kannst erkennen, warum genau die Abfrage langsamer wird bzw. kannst sie anschließend durch Vergabe von "Indexen" beschleunigen.
Ich kann euch sagen, dass es noch viele weitere Spielereien in MySQL gibt, die echt tolle Abfragen zulassen. Mir fallen da spontan so Dinge wie IN, BETWEEN, IF/ELSE, CASE, ON DUPLICATE KEY (Toll um Sachen auszulesen und sofort wieder an anderer Stelle zu speichern) und DATEDIFF.
HAVING war mir jedoch auch neu. Aber auch interessant, da man so einige Probleme Lösen könnte, in der Vergangenheit immer mit 2 Queries gelöst werden mussten. Danke für den Tipp
Würde ich jetzt an dem Satz fest machen: Aber ID 3 (Blaues Schwert) ist zwar in der ersten Tabelle vorhanden, aber existiert nicht in der 2. und soll somit nicht mit gewählt werden.
Dann wäre hier statt LEFT JOIN nur JOIN zu nehmen. Warum? Weil JOIN wesentlich schneller arbeitet und LEFT JOIN immer ein NULL zurück liefert, wenn kein Wert vorhanden ist. Das macht JOIN nicht. Sollte die Abfrage zu langsam werten, setze vor deine Abfrage einfach mal ein EXPLAIN und kopiere sie am besten in phpMyAdmin. Damit erhältst du anschließend eine Ausgabe und kannst erkennen, warum genau die Abfrage langsamer wird bzw. kannst sie anschließend durch Vergabe von "Indexen" beschleunigen.
Ich kann euch sagen, dass es noch viele weitere Spielereien in MySQL gibt, die echt tolle Abfragen zulassen. Mir fallen da spontan so Dinge wie IN, BETWEEN, IF/ELSE, CASE, ON DUPLICATE KEY (Toll um Sachen auszulesen und sofort wieder an anderer Stelle zu speichern) und DATEDIFF.
HAVING war mir jedoch auch neu. Aber auch interessant, da man so einige Probleme Lösen könnte, in der Vergangenheit immer mit 2 Queries gelöst werden mussten. Danke für den Tipp
Seit 02.07.2010 Papa einer süssen Tocher !!!!
http://www.burnerfm.de
Mit den besten Hits der 80´s, 90´s und von heute. Plus einigen PHPKit Addons... uvm.
Mit den besten Hits der 80´s, 90´s und von heute. Plus einigen PHPKit Addons... uvm.
Die Seite enthält auch noch viele weitere, nützliche Informationen zu PHP Funktionen, die man so gar nicht kennt. Ansonsten kann ich auch noch wärmstens das Handbuch empfehlen: http://dev.mysql.com/doc/refman/5.1/de/index.html
Erst mal danke für die ganzen Antworten.
Das Referenzbuch dürfte jedem Entwickler bekannt sein.
Ich finde aber Praktische Beispiele ganz gut, da ich einer bin der so leichter versteht, wie was funktioniert. Deswegen ist die Video2Brain Reihe auch so gut, da dort Alles als "Rohmaterial" auf den DVDs ist, leider gibt es für Fortgeschrittene Anwendung nicht viel dort.
Werde aber heute bestimmt nicht mehr dazu kommen, hier groß was zu basteln. Werde aber noch mal Alles durch gehen, aber leider ist wie gesagt die Datenbank ziemlich groß und eine Suche dauert jetzt mit LEFT JOIN schon mal gute 15 Sekunden auf einem lokalen XAMPP-Server, auf den ich alleine zugreife.
Das Referenzbuch dürfte jedem Entwickler bekannt sein.

Ich finde aber Praktische Beispiele ganz gut, da ich einer bin der so leichter versteht, wie was funktioniert. Deswegen ist die Video2Brain Reihe auch so gut, da dort Alles als "Rohmaterial" auf den DVDs ist, leider gibt es für Fortgeschrittene Anwendung nicht viel dort.
Werde aber heute bestimmt nicht mehr dazu kommen, hier groß was zu basteln. Werde aber noch mal Alles durch gehen, aber leider ist wie gesagt die Datenbank ziemlich groß und eine Suche dauert jetzt mit LEFT JOIN schon mal gute 15 Sekunden auf einem lokalen XAMPP-Server, auf den ich alleine zugreife.
Es geht nicht darum zu haben was man will, sondern zu schätzen was man hat!
Blutrausch HP
Mauern sind auch nur Steine & Wassertropen können auch mal Wassermengen werden!
Blutrausch HP
Mauern sind auch nur Steine & Wassertropen können auch mal Wassermengen werden!
Ähnliche Themen
-
alte Versionen [1.6.03|1.6.1|1.6.4] »-
Nur 5 neueste Downloads ?!
(20. Juni 2008, 21:04)
-
Web | Programmierung »-
DB Abfrage
(10. Februar 2008, 16:44)
-
alte Versionen [1.6.03|1.6.1|1.6.4] »-
HackBlock V2 und Adminbereich
(14. Januar 2008, 21:12)
-
alte Versionen [1.6.03|1.6.1|1.6.4] »-
Hack Block sperrt mich!
(10. Januar 2008, 15:44)


