SELEZIONA * DA più tabelle. MySQL

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

yeilds 5 righe (5 array), la photo è l’unico campo univoco di seguito. name, price ripetuto ( qui, fanta- name, price ripetuto 3 volte ) . Come faccio a sbarazzarmi di questi duplicati?

Modifica: voglio il name, price e tutte le photo per ogni bevanda.

  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 

    Quello che fai qui è chiamato JOIN (anche se lo fai implicitamente perché selezioni da più tabelle). Questo significa che se non hai inserito alcuna condizione nella tua clausola WHERE, hai avuto tutte le combinazioni di queste tabelle. Solo con le tue condizioni limiti il ​​tuo join a quelle file in cui l’id del drink corrisponde.

    Ma ci sono ancora X righe multiple nel risultato per ogni bevanda, se ci sono X foto con questo drink_id particolare. La tua affermazione non limita le foto che vuoi avere!

    Se vuoi solo una riga per bevanda, devi dire a SQL cosa vuoi fare se ci sono più righe con un particolare drink_id. Per questo è necessario il raggruppamento e una funzione aggregata . Dite a SQL quali voci vuoi raggruppare (ad esempio tutti i drink_idids) e nella SELECT, devi dire quale delle voci distinte per ogni riga di risultato raggruppata dovrebbe essere presa. Per i numeri, questo può essere medio, minimo, massimo (per nominarne alcuni).

    Nel tuo caso, non riesco a vedere il senso di interrogare le foto per le bevande se vuoi una sola riga. Probabilmente hai pensato che potresti avere una serie di foto nel risultato per ogni bevanda, ma SQL non può farlo. Se vuoi solo una foto e non ti interessa quale otterrai, raggruppa accanto al drink_id (per ottenere solo una riga per ogni bevanda):

     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, abbiamo anche GROUP_CONCAT , se vuoi che i nomi dei file siano concatenati su una singola stringa:

     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 

    Tuttavia, questo può diventare pericoloso se si dispone , all’interno dei valori del campo, poiché molto probabilmente si desidera dividerlo di nuovo sul lato client. Inoltre, non è una funzione di aggregazione SQL standard.

    Avrai i valori duplicati per nome e prezzo qui. Gli ID sono duplicati nella tabella drinks_photos. Non è ansible evitarli. Inoltre, esattamente cosa si desidera ottenere?

    Per eliminare i duplicati, puoi raggrupparli per drinks.id . Ma in questo modo otterrai una sola foto per ogni drinks.id (la foto che otterrai dipende dall’implementazione interna del database).

    Anche se non è documentato, nel caso di MySQL, otterrai la foto con l’ id più basso (nella mia esperienza non ho mai visto un altro comportamento).

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