Tach zusammen,
Ich habe viel gelesen, fleissig geübt, doch bin ich auf 4 Fragen / Probleme gestossen, für die ich keine (befriedigenden) lösungen gefunden habe.
1) Ich habe unterschiedliche Aussagen bzgl. dem Tempo zwischen einem Join via "where" und "join" gehört (in artikeln und foren) und auch selber bin ich nicht zu aussagekräftigen ergebnissen gekommen.
Deswegen bitte ganz klar: wenn ich über zwei und mehr tables abfragen will, was ist schneller: ein select via "join" oder "where"?
Beispiel mit hilfe der worlds-database von mysql.com:
SELECT city.name City, country.name Country FROM country, city WHERE city.CountryCode = country.code
SELECT city.name City, country.name Country FROM country JOIN city ON city.CountryCode = country.code
SELECT city.name City, country.name Country FROM city JOIN country ON city.CountryCode = country.code
Was ist besser, was ist schneller?
2) Ich habe keine Antwort auf folgendes problem gefunden.
Gegeben seien zwei tables t1 und t2.
t1 hat felder id - vorname - name, t2 felder id - ref_t1 - strasse - zip - stadt - land (ref_t1 ist die referenz zu t1)
So, was ich will, und ehrlich gesagt keinen plan habe wie ich das umsetzen soll (oder im moment einfach zu blind bin):
Ich will alle datensätze aus t1 die keinen dazugehörigen datensatz in t2 haben.
Folgendes habe ich bis dato gebastelt:
SELECT t1.id, t2.id FROM t1 LEFT JOIN t2 ON t1.id = t2.ref_t1
Das bringt mir alle übereinstimmenden rows + die rows in t1 die keine entsprechende in t2 haben, sprich "NULL"
Aber die Lösung des eigentlichen Problems…
Ich trau mich erst gar keinen einen meiner versuche aufzuführen, da es zu viele waren.
Ist sowas überhaupt lösbar?
3) Suche nach einer Richtlinie
Wenn man bei einem Join weitere Eingrenzungen vornehmen möchte, was wählt man dazu: "ON" oder "WHERE"?
OK, die Frage sagt gar nichts.
Wieder 2 tables, t1 & t2. beide will ich über ein feld id verknüpfen:
SELECT t1.id, t2.id FROM t1 JOIN t2 ON t1.id = t2.id
OK, hier hätte man auch "USING" verwenden können, aber darum geht’s ned.
Nehmen wir an, ich will die auswahl auf einige IDs begrenzen, und alle datensätze sollen in deutsch sein (feld t2.language)
Wie geht man vor :
SELECT t1.id, t2.id FROM t1 JOIN t2 ON t1.id = t2.id AND t1.id IN (1,2,3) AND t2.language = 'deutsch'
oder
SELECT t1.id, t2.id FROM t1 JOIN t2 ON t1.id = t2.id WHERE t1.id IN (1,2,3) AND t2.language = 'deutsch'
Gibt es da eine Richtlinie, Empfehlung, was nun besser ist? Und warum?
4) So, und jetzt wird es für mich als neuling wirklich verzwickt, und ich suche nach einer besseren lösung.
Ausgangssituation:
Table: user, Felder: id
Table: user_details, Felder: id, ref_user (referenz zum user-table), name, email
Table: user_images, Felder: id, ref_user (referenz zum user-table), dateiname
Soweit, so gut.
Wie ich einen User mit seinen Details und einem Bild mittels einem Select bekomme ist klar (2 joins)
Jetzt kommt nur das problem: ein user kann zwar nur einen entsprechenden datensatz in user_details haben, aber mehrere in user_images.
Und hier weiß ich quasi nimma weiter.
Mir ist eine Lösung bekannt:
Man fragt in einem select nach user mit seinen details und in einem zweiten select nach den bildern und gibt sie dann in einer schleife aus.
Doch das gefällt mir nicht.
Mir ist auch eine weitere Lösung bekannt:
SELECT u.id userID, d.id detailsID, im.dateiname FROM user u JOIN user_details d ON u.id = d.ref_user JOIN user_images im ON u.id = im.ref_user WHERE d.id = 3
Dies ergibt dann ungefähr folgendes ergebnis:
userID --- detailsID --- dateiname
4 2 bild-01.jpg
4 2 bild-02.jpg
4 2 bild-03.jpg
Doch ich kenne keine elegante lösung, um sowas nun per PHP in einen array zu überführen; habe mir ehrlich gesagt auch noch nicht so viele gedanken drüber gemacht, die daten zu gruppieren etc.
Ich hoffe, die Problematik einigermassen rüber gebracht zu haben, und frage, was nun besser ist, vor allem wie man am besten die daten per PHP grupiert.
Das wars mit meiner Fragerei. Ich bin für jegliche Inspiration sehr dankbar.
Ich habe viel gelesen, fleissig geübt, doch bin ich auf 4 Fragen / Probleme gestossen, für die ich keine (befriedigenden) lösungen gefunden habe.
1) Ich habe unterschiedliche Aussagen bzgl. dem Tempo zwischen einem Join via "where" und "join" gehört (in artikeln und foren) und auch selber bin ich nicht zu aussagekräftigen ergebnissen gekommen.
Deswegen bitte ganz klar: wenn ich über zwei und mehr tables abfragen will, was ist schneller: ein select via "join" oder "where"?
Beispiel mit hilfe der worlds-database von mysql.com:
SELECT city.name City, country.name Country FROM country, city WHERE city.CountryCode = country.code
SELECT city.name City, country.name Country FROM country JOIN city ON city.CountryCode = country.code
SELECT city.name City, country.name Country FROM city JOIN country ON city.CountryCode = country.code
Was ist besser, was ist schneller?
2) Ich habe keine Antwort auf folgendes problem gefunden.
Gegeben seien zwei tables t1 und t2.
t1 hat felder id - vorname - name, t2 felder id - ref_t1 - strasse - zip - stadt - land (ref_t1 ist die referenz zu t1)
So, was ich will, und ehrlich gesagt keinen plan habe wie ich das umsetzen soll (oder im moment einfach zu blind bin):
Ich will alle datensätze aus t1 die keinen dazugehörigen datensatz in t2 haben.
Folgendes habe ich bis dato gebastelt:
SELECT t1.id, t2.id FROM t1 LEFT JOIN t2 ON t1.id = t2.ref_t1
Das bringt mir alle übereinstimmenden rows + die rows in t1 die keine entsprechende in t2 haben, sprich "NULL"
Aber die Lösung des eigentlichen Problems…
Ich trau mich erst gar keinen einen meiner versuche aufzuführen, da es zu viele waren.
Ist sowas überhaupt lösbar?
3) Suche nach einer Richtlinie
Wenn man bei einem Join weitere Eingrenzungen vornehmen möchte, was wählt man dazu: "ON" oder "WHERE"?
OK, die Frage sagt gar nichts.
Wieder 2 tables, t1 & t2. beide will ich über ein feld id verknüpfen:
SELECT t1.id, t2.id FROM t1 JOIN t2 ON t1.id = t2.id
OK, hier hätte man auch "USING" verwenden können, aber darum geht’s ned.
Nehmen wir an, ich will die auswahl auf einige IDs begrenzen, und alle datensätze sollen in deutsch sein (feld t2.language)
Wie geht man vor :
SELECT t1.id, t2.id FROM t1 JOIN t2 ON t1.id = t2.id AND t1.id IN (1,2,3) AND t2.language = 'deutsch'
oder
SELECT t1.id, t2.id FROM t1 JOIN t2 ON t1.id = t2.id WHERE t1.id IN (1,2,3) AND t2.language = 'deutsch'
Gibt es da eine Richtlinie, Empfehlung, was nun besser ist? Und warum?
4) So, und jetzt wird es für mich als neuling wirklich verzwickt, und ich suche nach einer besseren lösung.
Ausgangssituation:
Table: user, Felder: id
Table: user_details, Felder: id, ref_user (referenz zum user-table), name, email
Table: user_images, Felder: id, ref_user (referenz zum user-table), dateiname
Soweit, so gut.
Wie ich einen User mit seinen Details und einem Bild mittels einem Select bekomme ist klar (2 joins)
Jetzt kommt nur das problem: ein user kann zwar nur einen entsprechenden datensatz in user_details haben, aber mehrere in user_images.
Und hier weiß ich quasi nimma weiter.
Mir ist eine Lösung bekannt:
Man fragt in einem select nach user mit seinen details und in einem zweiten select nach den bildern und gibt sie dann in einer schleife aus.
Doch das gefällt mir nicht.
Mir ist auch eine weitere Lösung bekannt:
SELECT u.id userID, d.id detailsID, im.dateiname FROM user u JOIN user_details d ON u.id = d.ref_user JOIN user_images im ON u.id = im.ref_user WHERE d.id = 3
Dies ergibt dann ungefähr folgendes ergebnis:
userID --- detailsID --- dateiname
4 2 bild-01.jpg
4 2 bild-02.jpg
4 2 bild-03.jpg
Doch ich kenne keine elegante lösung, um sowas nun per PHP in einen array zu überführen; habe mir ehrlich gesagt auch noch nicht so viele gedanken drüber gemacht, die daten zu gruppieren etc.
Ich hoffe, die Problematik einigermassen rüber gebracht zu haben, und frage, was nun besser ist, vor allem wie man am besten die daten per PHP grupiert.
Das wars mit meiner Fragerei. Ich bin für jegliche Inspiration sehr dankbar.
Kommentar