sql >> Databáze >  >> RDS >> Mysql

SELECT * FROM více tabulek. MySQL

To, co zde děláte, se nazývá JOIN (ačkoli to děláte implicitně, protože vybíráte z více tabulek). To znamená, že pokud jste do klauzule WHERE nezadali žádné podmínky, měli jste všechny kombinace těch tabulek. Pouze svou podmínkou omezíte připojení na ty řádky, kde se shoduje ID nápoje.

Stále je však ve výsledku pro každý nápoj X více řádků, pokud existuje X fotografií s tímto konkrétním nápojem_id. Vaše prohlášení neomezuje které fotografie, které chcete mít!

Pokud chcete pouze jeden řádek na drink, musíte SQL sdělit, co chcete udělat, pokud existuje více řádků s konkrétním nápojem_id. K tomu potřebujete seskupování a agregační funkci . Řeknete SQL, které položky chcete seskupit (například všechny stejné id_nápoje) a v SELECT musíte říci, které z odlišných položek pro každý seskupený řádek výsledku by měly být brány. U čísel to může být průměr, minimum, maximum (abychom mohli jmenovat některé).

Ve vašem případě nevidím smysl dotazovat se na fotky na nápoje, pokud chcete pouze jednu řadu. Pravděpodobně jste si mysleli, že můžete mít pole fotografií ve vašem výsledku pro každý drink, ale SQL to neumí. Pokud chcete pouze jakékoli fotku a je vám jedno, kterou dostanete, prostě seskupte podle id_nápoje (abyste získali pouze jeden řádek na nápoj):

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

V MySQL máme také GROUP_CONCAT , pokud chcete, aby byly názvy souborů zřetězeny do jednoho jediného řetězce:

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

To však může být nebezpečné, pokud máte , v rámci hodnot polí, protože to pravděpodobně budete chtít znovu rozdělit na straně klienta. Také to není standardní agregační funkce SQL.



  1. Offline instalace MariaDB Cluster pro CentOS

  2. IN Klauzule s NULL nebo IS NULL

  3. Čtenář řešení výzvy Special Islands

  4. Jak zkontrolovat, zda uživatel kliknul na [Storno] na InputBox ve VBA