Mysql
 sql >> Baza danych >  >> RDS >> Mysql

WYBIERZ * Z wielu tabel. MySQL

To, co tutaj robisz, nazywa się JOIN (chociaż robisz to niejawnie, ponieważ wybierasz z wielu tabel). Oznacza to, że jeśli nie umieściłeś żadnych warunków w klauzuli WHERE, masz wszystkie kombinacje tych stołów. Tylko ze swoim stanem możesz ograniczyć dołączanie do tych wierszy, w których pasuje identyfikator napoju.

Ale nadal istnieje X wielu wierszy w wyniku dla każdego drinka, jeśli jest X zdjęć z tym konkretnym drink_id. Twoje oświadczenie nie ogranicza którego zdjęcia, które chcesz mieć!

Jeśli chcesz mieć tylko jeden wiersz na drinka, musisz powiedzieć SQL, co chcesz zrobić, jeśli istnieje wiele wierszy o określonym identyfikatorze drink_id. W tym celu potrzebujesz grupowania i funkcji agregującej . Mówisz SQL, które wpisy chcesz zgrupować (na przykład wszystkie równe drinki_ids), a w SELECT musisz powiedzieć, które z odrębnych wpisów dla każdego zgrupowanego wiersza wyników powinny być wzięte. W przypadku liczb może to być średnia, minimalna, maksymalna (żeby wymienić niektóre).

W twoim przypadku nie widzę sensu kwestionowania zdjęć o napoje, jeśli chcesz tylko jeden wiersz. Prawdopodobnie myślałeś, że możesz mieć tablicę zdjęć w wyniku dla każdego drinka, ale SQL nie może tego zrobić. Jeśli chcesz tylko dowolnego zdjęcie i nie obchodzi Cię, które dostaniesz, po prostu pogrupuj według drinks_id (aby uzyskać tylko jeden wiersz na drinka):

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

W MySQL mamy również GROUP_CONCAT , jeśli chcesz, aby nazwy plików były połączone w jeden ciąg:

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

Może to jednak stać się niebezpieczne, jeśli masz , w obrębie wartości pól, ponieważ najprawdopodobniej chcesz podzielić to ponownie po stronie klienta. Nie jest to również standardowa funkcja agregująca SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wykonać polecenie MySQL ze skryptu powłoki?

  2. Którego typu danych MySQL użyć do przechowywania wartości logicznych

  3. Przewodnik po projektowaniu bazy danych dla biuletynu w MySQL

  4. Jak tworzyć relacje w MySQL

  5. Jak zainstalować sterownik pdo w obrazie dokera php?