Ich habe zwei Tabellen, PET und POST. PET enthält id, pet_name, pet_description, pet.price und einige andere Details. POST hat eine Beziehung zwischen PET und der USER-Tabelle. POST hat id, pet_id, buyer_id, favourite Spalten.

Wenn ein Benutzer ein Haustier als seinen Favoriten markiert, wird ein Eintrag zur Tabelle POST hinzugefügt. Jetzt muss ich alle Haustiere abrufen. Wenn der angegebene Benutzer 2 Haustiere als seinen Favoriten markiert hat, wird eine Flagge mit dem Wert true für diese 2 Haustiere und dem Wert "false" für andere Haustiere angezeigt.

Ich habe die folgende Abfrage versucht, aber diese Abfrage gibt nur die Lieblingstiere des angegebenen Benutzers zurück. Die Anforderung besteht jedoch darin, alle Haustiere und eine Spalte mit dem Wert true gegen sie abzurufen, wenn der angegebene Benutzer dieses Haustier als Favorit markiert hat, andernfalls false.

select pet.pet_name, post.favourite 
  from example.pet 
  left 
  join example.post 
    on pet.id = post.pet_id 
 where post.buyer_id = 4;

POST TABLE SAMPLE DATA

PET TABLE SAMPLE DATA

-2
Ashish Kumar 19 Jän. 2019 im 20:55

3 Antworten

Beste Antwort

Sie müssen die po1.buyer_id = 4 in die ON -Klausel des linken Joins verschieben. In WHERE werden alle Zeilen gefiltert, in denen kein entsprechender Datensatz in post gefunden wurde. Daher erhalten Sie nicht alle Haustiere.

Um zu überprüfen, ob der Benutzer genau zwei Haustiere bevorzugt hat, können Sie eine korrelierte Unterabfrage verwenden, um die Anzahl der Favoriten des Benutzers zu ermitteln.

SELECT pe1.name,
       coalesce(po1.favourite, 0)
       FROM example.pet pe1
            LEFT JOIN example.post po1
                      ON po1.pet_id = pe1.id
                         AND po1.buyer_id = 4
       WHERE (SELECT count(*)
                     FROM example.post po2
                     WHERE po2.buyer_id = po1.buyer_id
                           AND po2.favourite = 1) = 2;
0
sticky bit 19 Jän. 2019 im 18:55

Ich denke, eine Unterabfrage ist am einfachsten:

select p.*,
       (case when exists (select 1
                          from posts po
                          where po.pet_id = p.id and po.buyer_id = 4
                         )
             then 1 else 0
        end) as is_favorite
from pets p;
0
Gordon Linoff 19 Jän. 2019 im 20:13

Überprüfen Sie dies:

select pet.pet_name, 
  case when (select sum(favorite) from petquest.post where pet.id = post.pet_id) > 1 then 'true' else 'false' end as favstat
from petquest.pet

Mit Ihrem Ansatz

select pet.pet_name
     , CASE WHEN sum(post.favourite) > 1 THEN 'True' else 'False' end as favstat

  from example.pet 
  inner join example.post 
    on pet.id = post.pet_id 
 group by pet.pet;

Oder

 select pet.pet_name
     , CASE WHEN (sum(post.favourite) over (partition by pet.pet_name)) > 1 THEN 'True' else 'False' end as favstat
  from example.pet 
  inner join example.post 
    on pet.id = post.pet_id ;
-1
Derviş Kayımbaşıoğlu 19 Jän. 2019 im 18:30