Wie man in MySQL aus mehreren Tabellen AUSWAHLEN kann

Rayven Esplanada 14 November 2020
  1. Verwendung von GROUP BY food zum SELECT aus mehreren Tabellen
  2. Verwendung von JOIN zum SELECT aus mehreren Tabellen in MySQL
  3. Verwendung von GROUP_CONCAT() und manipulieren Sie die Ergebnisse in MySQL
Wie man in MySQL aus mehreren Tabellen AUSWAHLEN kann

Dieses Tutorial zeigt Ihnen, wie Sie SELECT aus mehreren Tabellen in einem einzigen Skript unter Verwendung von MySQL abfragen können.

Lassen Sie uns ein Szenario demonstrieren:

SELECT name, price, details, type,  FROM food, food_order  WHERE breakfast.id = 'breakfast_id'

Stellen wir uns nun Beispieltabellen für jeden FROM-Eintrag vor:

  • food
food_id name price options
1 Eggs 10.00 Scrambled, Sunny Side, Boiled
2 Ice cream 30.00 Vanilla, Strawberry, Chocolate
3 Ramen 12.00 Regular, Spicy
  • food_menu
order_id photo food_id
1 eggs_scrambled.jpg 1
2 eggs_sunnyside.jpg 1
3 eggs_boiled.png 1
4 icecream_vanilla.jpg 2
5 icecream_strawberry.jpg 2
6 ice_cream_chocolate.jpg 2
7 ramen_regular.jpg 3
8 ramen_spicy.jpg 3

Basierend auf den obigen Tabellen können wir sehen, dass Eier 3 Fotos haben, Eiscreme ebenfalls 3, während Ramen 2 hat. Die Ausgabe, die wir erzeugen wollen, ist eine aggregierte Tabelle von food und food_menu, die alle Lebensmittel zusammen anzeigt und sie mit den entsprechenden Fotos im Menü kombiniert.

Wenn wir dies abfragen:

SELECT name, price, options, photo 
FROM food, food_menu 
WHERE food_id = '1'

Das Ergebnis wäre dies:

name price options photo
1 Eggs Scrambled, Sunny Side, Boiled eggs_sunnyside.jpg
2 Eggs Scrambled, Sunny Side, Boiled eggs_scrambled.jpg
3 Eggs Scrambled, Sunny Side, Boiled eggs_boiled.jpg

Die Daten werden dupliziert, weil es mehrere Reihen von food_menu gibt, die sich auf food beziehen. In diesem Fall gibt es 3 Fotos im food_menu, die direkt mit den Eiern verbunden sind.

Es ist für eine einfache Abfrage nicht möglich, alle Einträge in food_menu in einer einzigen Zeile zusammenzufassen, da sie alle als separate Entitäten betrachtet werden, die sich auf die Tabelle food beziehen.

Wenn Sie food und food_menu gleichzeitig in einer einzigen Zeile abfragen wollen, dann haben Sie hier ein paar Möglichkeiten, dies zu tun.

Verwendung von GROUP BY food zum SELECT aus mehreren Tabellen

Dieser Ansatz verwendet GROUP BY, um beide Tabellen in einem Ergebnis zu aggregieren. Der Nachteil ist jedoch, dass Sie nur die erste Instanz von food_menu erhalten, da wir die Ergebnisse zwingen, einzigartig zu sein.

Unten sehen Sie die Anfrage an die GROUP BY food-Tabelle:

SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1' 
GROUP BY food_id

Sie würde dann das folgende Ergebnis anzeigen:

name price options photo
1 Eggs Scrambled, Sunny Side, Boiled eggs_sunnyside.jpg

Wir haben nun die Bedingung erfüllt, obwohl nur ein Foto zurückgegeben wird, das die erste Instanz des von der Abfrage gefundenen food_menu ist.

Verwendung von JOIN zum SELECT aus mehreren Tabellen in MySQL

Bei diesem Ansatz wird der SQL-Befehl JOIN oder RIGHT JOIN verwendet.

Anstatt 2 FROM-Bedingungen im Skript zu haben, JOIN wir food_menu basierend auf seinem Fremdschlüssel food_id. Wir haben f für food_menu und fm für food_menu aliasiert.

SELECT f.name, f.price, f.options, fm.food_menu
FROM food AS f
JOIN food_menu AS fm ON fm.food_id = f.food_id
WHERE food_id = '1'
GROUP BY f.food_id

Obwohl sich diese Methode von der vorherigen unterscheidet, führt sie zum gleichen Ergebnis. Sie gibt die erste Instanz von food_menu zurück, weil GROUP BY die Abfrage zwingt, eindeutige Zeilen basierend auf ihrer Bedingung zurückzugeben.

name price options photo
1 Eggs Scrambled, Sunny Side, Boiled eggs_sunnyside.jpg

Verwendung von GROUP_CONCAT() und manipulieren Sie die Ergebnisse in MySQL

Eine Abhilfe für das Problem der vorherigen Lösung besteht darin, GROUP_CONCAT() zu verwenden, um alle Ergebnisse von food_menu in eine einzige Zeichenkette zu setzen, daher wird es möglich sein, alle ihre Datensätze in eine einzige Zeile zu setzen.

Was ist GROUP_CONCAT()?

GROUP_CONCAT ist eine Funktion, die die Daten aus mehreren Zeilen zu einem einzigen Feld kombiniert. Es ist eine spezielle Funktion GROUP BY, die eine modifizierte Zeichenkette zurückgibt, wenn die Gruppe mindestens 1 Nicht-Null-Wert enthält. Andernfalls gibt sie NULL zurück.

Wir modifizieren die obige Abfrage zu GROUP_CONCAT() photos column, um die Ergebnisse zu einer Zeichenkette zu verketten.

SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
WHERE food_id = '1' 
GROUP BY food_id

Auf diese Weise verknüpfen wir die Fotospalte von food_menu, so dass nur eine Zeile pro eindeutigem Eintrag von food erzeugt wird. Das Ergebnis würde wie angezeigt aussehen:

name price options photo
1 Eggs Scrambled, Sunny Side, Boiled eggs_sunnyside.jpg,eggs_scrambled.jpg,eggs_boiled.jpg

Wie Sie sehen können, wurden die 3 photo-Spalten verkettet, die sich auf Eier in der food-Tabelle beziehen.

Wenn wir die Bedingung GROUP BY and WHERE entfernen

SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu

Das Ergebnis würde wie folgt aussehen

name price options photo
1 Eggs Scrambled, Sunny Side, Boiled eggs_sunnyside.jpg,eggs_scrambled.jpg,eggs_boiled.jpg
2 Ice Cream Vanilla, Strawberry, Chocolate icecream_vanilla.jpg,icecream_strawberry.jpg,icecream_chocolate.jpg
3 Ramen Regular, Spicy ramen_regular.jpg,ramen_spicy.jpg

Seien Sie vorsichtig bei der Verwendung von GROUP_CONCAT(). Wenn Ihre Zeichenkette ein Komma enthält und Ihr CONCAT-Trennzeichen ebenfalls ein Komma ist, würde das Parsen Ihrer Spalte Ihre Daten verfälschen.

Bevor Sie also diese Funktion verwenden, stellen Sie sicher, dass Ihr Begrenzungszeichen ein ungültiges Zeichen für die Spalte ist, mit der Sie es manipulieren.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

Verwandter Artikel - MySQL Table