wake-up-neo.com

SELECT * FROM mehrere Tabellen. MySQL

SELECT name, price, photo FROM drinks, drinks_photos WHERE drinks.id = drinks_id

wenn Sie 5 Zeilen (5 Arrays) verwenden, ist photo das einzige eindeutige Feld in einer Zeile. name, price werde hier wiederholt (, fanta-name, price 3 mal wiederholen. ) Wie werde ich diese Duplikate los?

Bearbeiten: Ich möchte name, price und alle photo für jedes Getränk.

 id      name      price
  1.    fanta        5
  2.     dew         4


 id      photo                   drinks_id
  1.     ./images/fanta-1.jpg      1
  2.     ./images/fanta-2.jpg      1  
  3.     ./images/fanta-3.jpg      1 
  4.     ./images/dew-1.jpg        2
  5.     ./images/dew-2.jpg        2
64
NestedWeb

Was Sie hier tun, heißt JOIN (obwohl Sie dies implizit tun, weil Sie aus mehreren Tabellen auswählen). Das heißt, wenn Sie in Ihrer WHERE-Klausel keine Bedingungen angegeben haben, hatten Sie alle Kombinationen dieser Tabellen. Nur mit Ihrer Bedingung beschränken Sie Ihre Verknüpfung auf die Zeilen, in denen die Getränke-ID übereinstimmt.

Aber es gibt immer noch X Mehrfachzeilen im Ergebnis für jedes Getränk, wenn es X Fotos mit dieser speziellen drinks_id gibt. Ihre Aussage schränkt nicht ein welches Foto (s), die Sie haben möchten!

Wenn Sie nur eine Zeile pro Getränk möchten, müssen Sie SQL mitteilen, was Sie tun möchten, wenn mehrere Zeilen mit einer bestimmten drinks_id vorhanden sind. Dazu benötigen Sie eine Gruppierung und eine Aggregatfunktion . Sie teilen SQL mit, welche Einträge Sie gruppieren möchten (z. B. alle gleichen drinks_ids), und Sie müssen in SELECT angeben, welche der unterschiedlichen Einträge für jede gruppierte Ergebniszeile verwendet werden sollen. Bei Zahlen kann dies der Durchschnitt, das Minimum oder das Maximum sein (um nur einige zu nennen).

In Ihrem Fall kann ich den Sinn nicht erkennen, die Fotos nach Getränken abzufragen, wenn Sie nur eine Zeile möchten. Sie dachten wahrscheinlich, Sie könnten ein Array von Fotos in Ihrem Ergebnis für jedes Getränk haben, aber SQL kann dies nicht tun. Wenn Sie nur ein beliebiges Foto möchten und es Ihnen egal ist, welches Sie erhalten, gruppieren Sie es einfach nach der drinks_id (um nur eine Zeile pro Getränk zu erhalten):

SELECT name, price, photo
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id
name     price   photo
fanta    5       ./images/fanta-1.jpg
dew      4       ./images/dew-1.jpg

In MySQL haben wir auch GROUP_CONCAT , wenn die Dateinamen zu einer einzigen Zeichenfolge verkettet werden sollen:

SELECT name, price, GROUP_CONCAT(photo, ',')
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id
name     price   photo
fanta    5       ./images/fanta-1.jpg,./images/fanta-2.jpg,./images/fanta-3.jpg
dew      4       ./images/dew-1.jpg,./images/dew-2.jpg

Dies kann jedoch gefährlich werden, wenn Sie , innerhalb der Feldwerte, da Sie diese höchstwahrscheinlich clientseitig wieder aufteilen möchten. Es ist auch keine Standard-SQL-Aggregatfunktion.

92
leemes

Hier haben Sie die doppelten Werte für Name und Preis. Und IDs sind in der drinks_photos-Tabelle doppelt vorhanden. Sie können sie auf keinen Fall umgehen. Was genau möchten Sie auch ausgeben?

3
AnandPhadke

Um Duplikate zu entfernen, können Sie nach drinks.id Gruppieren. Auf diese Weise erhalten Sie jedoch nur ein Foto pro drinks.id (Welches Foto Sie erhalten, hängt von der internen Implementierung der Datenbank ab).

Obwohl es nicht dokumentiert ist, erhalten Sie im Falle von MySQL das Foto mit dem niedrigsten id (nach meiner Erfahrung habe ich noch nie ein anderes Verhalten gesehen).

SELECT name, price, photo 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id
GROUP BY drinks.id
2
bhovhannes