2017-07-19 2 views
0

Ergebnisse Ich habe folgende MySQL-Tabellen:Fügen Sie NULL-Werte in MySQL SELECT

tbl_pet_owners:

+----+--------+----------+--------+--------------+ 
| id | name | pet  | city | date_adopted | 
+----+--------+----------+--------+--------------+ 
| 1 | jane | cat  | Boston | 2017-07-11 | 
| 2 | jane | dog  | Boston | 2017-07-11 | 
| 3 | jane | cat  | Boston | 2017-06-11 | 
| 4 | jack | cat  | Boston | 2016-07-11 | 
| 5 | jim | snake | Boston | 2017-07-11 | 
| 6 | jim | goldfish | Boston | 2017-07-11 | 
| 7 | joseph | cat  | NYC | 2016-07-11 | 
| 8 | sam | cat  | NYC | 2017-07-11 | 
| 9 | drew | dog  | NYC | 2016-07-11 | 
| 10 | jack | frog  | Boston | 2017-07-19 | 
+----+--------+----------+--------+--------------+ 

tbl_pet_types:

+----------+-------------+ 
| pet  | type  | 
+----------+-------------+ 
| cat  | mammal  | 
| dog  | mammal  | 
| goldfish | fish  | 
| goldfish | seacreature | 
| snake | reptile  | 
+----------+-------------+ 

ich die folgende SELECT-Anweisung haben

SELECT DISTINCT owners.name, owners.pet, owners.city, 
group_concat(DISTINCT types.type separator ', ') AS type 
FROM tbl_pet_owners owners 
INNER JOIN tbl_pet_types types ON owners.pet = types.pet 
WHERE owners.city = 'Boston' OR owners.city = 'NYC' 
GROUP BY owners.name, owners.pet 
ORDER BY owners.city 

..welche dieses Ergebnis zurück:

+--------+----------+--------+-------------------+ 
| name | pet  | city | type    | 
+--------+----------+--------+-------------------+ 
| jack | cat  | Boston | mammal   | 
| jane | cat  | Boston | mammal   | 
| jane | dog  | Boston | mammal   | 
| jim | goldfish | Boston | fish, seacreature | 
| jim | snake | Boston | reptile   | 
| drew | dog  | NYC | mammal   | 
| joseph | cat  | NYC | mammal   | 
| sam | cat  | NYC | mammal   | 
+--------+----------+--------+-------------------+ 

Leider aus den Ergebnissen nicht angegeben, Buchse des Frosches, weil es keinen Eintrag für Frosch in tbl_pet_types ist. Wie kann ich meine Abfrage so bearbeiten, dass sie den Frosch in den Ergebnissen enthält (mit type = NULL)?

+3

Ändern Sie Ihren 'INNER JOIN' in einen' LINKEN OUTER JOIN' und lassen Sie ihn rippen. 'INNER JOIN' sagt" Gib nur Ergebnisse zurück, bei denen die Join-Bedingung zutrifft ". 'LEFT OUTER JOIN' sagt:" Gib alle Ergebnisse aus der ersten Tabelle zurück und nur die Ergebnisse aus der linksbündigen Tabelle, wo die Bedingung wahr ist " – JNevill

+1

Mögliche Duplikate von [Was ist der Unterschied zwischen" INNER JOIN "und" OUTER JOIN "? "?] (https://stackoverflow.com/questions/38549/what-is-the-difference-between-inner-join-and-outer-join) – JNevill

+0

@JNevill Ich denke diese Bedingungen in der WHERE-Klausel auch müssen in die ON-Klausel verschoben werden. –

Antwort

1

Verwenden Sie einen LEFT statt eines INNER JOIN auf die tbl_pet_types JOIN. Was ein INNER JOIN macht, ist sicherzustellen, dass nur die Datensätze in beiden Tabellen angezeigt werden, die übereinstimmen. In diesem speziellen Fall möchten Sie alle tbl_pet_owners-Daten unabhängig davon, ob sie mit tbl_pet übereinstimmen.

SELECT DISTINCT owners.name, owners.pet, owners.city, 
group_concat(DISTINCT types.type separator ', ') AS type 
FROM tbl_pet_owners owners 
LEFT JOIN tbl_pet_types types ON owners.pet = types.pet 
WHERE owners.city = 'Boston' OR owners.city = 'NYC' 
GROUP BY owners.name, owners.pet 
ORDER BY owners.city 
+0

Es ist nicht notwendig, 'DISTINCT' in der select-Klausel zu verwenden, und' owners.city' sollte möglicherweise in der 'GROUP BY'-Liste enthalten sein. –

1

Ich kann die folgende Abfrage vorschlagen, die ähnlich zu dem ist, was Sie ursprünglich hatten, aber mit ein paar Änderungen.

SELECT 
    owners.name, 
    owners.pet, 
    owners.city, 
    GROUP_CONCAT(DISTINCT COALESCE(types.type, 'NA') separator ', ') AS type 
FROM tbl_pet_owners owners 
LEFT JOIN tbl_pet_types types 
    ON owners.pet = types.pet 
WHERE owners.city = 'Boston' OR owners.city = 'NYC' 
GROUP BY owners.name, owners.pet, owners.city 
ORDER BY owners.city 

Sie brauchen nicht DISTINCT in Ihrer select-Klausel zu verwenden, da GROUP BY bereits erreichen, was Sie im Sinn hatte. Die wichtigste Änderung war die Umstellung auf LEFT JOIN. Dies sollte verhindern, dass Datensätze gelöscht werden.

2

Sie verwenden eine INNER JOIN, da es keine Übereinstimmung in beiden Tabellen gibt, wird diese Zeile nicht angezeigt. Versuchen Sie es mit einem LEFT JOIN, so dass alle Werte in der linken (ersten) Tabelle angezeigt werden, unabhängig davon, ob es eine Antwort in der rechten (zweiten) Tabelle gibt.

Sie können dies mit diesem Bild visualisieren enter image description here