Wie man in MySQL aus mehreren Tabellen AUSWAHLEN kann
-
Verwendung von GROUP BY
food
zum SELECT aus mehreren Tabellen -
Verwendung von
JOIN
zum SELECT aus mehreren Tabellen in MySQL -
Verwendung von
GROUP_CONCAT()
und manipulieren Sie die Ergebnisse in MySQL
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.
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.
LinkedInVerwandter Artikel - MySQL Table
- Alle Zeilen einer MySQL-Tabelle durchlaufen
- Kopieren Sie Tabellenstrukturen, ohne Daten in MySQL zu kopieren
- Rufen Sie die ID des zuletzt eingefügten Datensatzes in MySQL ab
- Sichern Sie eine einzelne Tabelle mit Mysqldump
- Tabellen- und Datenbankstruktur in MySQL anzeigen
- Unterschied zwischen zwei Tabellen in MySQL