2017-12-26 5 views
3

Ich habe dieses SQLFiddle Demo für ein besseres Verständnis des Problems erstellt.die Abfrage gibt nicht die Ergebnisse, die ich will

Zuerst werde ich versuchen, Ihnen zu sagen, was ich tun möchte. Menschen können ihre eigenen Gruppenseiten über Facebook erstellen. Ich habe es Menschen ermöglicht, eigene Gruppen-Seiten in meinem eigenen Social-Networking-Projekt aufzubauen. Wir wissen, dass Facebook auf der Hauptseite unter dem Namen empfohlene Gruppen angezeigt wird. Es gibt zwei oder mehr verschiedene vorgeschlagene Gruppen. Genau das möchte ich tun. Ich möchte die vorgeschlagene Gruppe von meiner Hauptseite aus anzeigen.

Wie können Sie in der Abfrage sehen gibt es einige Bedingungen zur Verfügung, diese sind jeweils wie folgt:

1-) Die Person, die die Gruppe eingerichtet wird die Gruppe nicht sehen ist er in den empfohlenen Gruppen einrichten .

2-) Die Person kann die verbundene Gruppe nicht von den empfohlenen Gruppen sehen.

In den empfohlenen Gruppen möchte ich nur zwei vorgeschlagene Gruppen anzeigen.

Die Abfrage ist hier:

SELECT 
    G.group_id, 
    G.group_owner_id, 
    G.group_name, 
    G.group_title, 
    G.group_cover, 
    F.group_oid, 
    F.group_user_id 
FROM group_users F 
INNER JOIN groups G 
    ON G.group_id = F.group_oid 
WHERE 
    G.status = '1' AND 
    F.group_oid <> '10' AND 
    F.group_user_id <> '10' 
GROUP BY 
    F.group_oid 
ORDER BY rand() 
LIMIT 2 
  1. Erstes Problem ist: Menschen aus vorgeschlagenen Gruppen seine eigene Gruppe zu sehen. I möchte nicht seine eigene Gruppe von vorgeschlagenen in dieser Abfrage zeigen.

  2. Zweites Problem ist: Leute sehen seine verbundene Gruppe von vorgeschlagenen Gruppen. Ich möchte seine beigetretene Gruppe nicht von der in dieser vorgeschlagenen Abfrage zeigen.

Sie erste Problem mit der Demo testen, wie folgt:

Die Zahl 10 ist die Gruppe sapsik erstellt (group_id 16). Die Abfrage muss diese Zeile in der Ausgabe deaktivieren, da wir 10 in dieser Abfrage verwenden.

F.group_oid <> '10' AND 
F.group_user_id <> '10' 

Und auch Sie können Zweites Problem mit der Demo testen, wie folgt:

Die numver 8 ist nicht seine eigene Gruppe erstellt, Nummer 8 gerade beigetreten Gruppe 16 (table group_users, row group_oid 16 , group_user_id 8). Aber wenn Sie die folgende Zeile wie folgt ändern

F.group_oid <> '8' AND 
F.group_user_id <> '8' 

Nummer 8 weiterhin die Gruppe zu sehen, die noch registriert ist.

Antwort

4

Müssen Sie wirklich F.group_oid und F.group_user_id holen?

Wenn nicht, können Sie diese Abfrage verwenden:

SELECT 
    G.group_id, 
    G.group_owner_id, 
    G.group_name, 
    G.group_title, 
    G.group_cover 
FROM groups G 
WHERE 
    G.status = '1' AND 
    G.group_id NOT IN (
     SELECT F.group_oid 
     FROM group_users F 
     WHERE F.group_oid = '10' OR 
     F.group_user_id = '10' 
    ) 
ORDER BY rand() 
LIMIT 2 

Das Problem mit Ihrer Anfrage ist, dass, wenn zwei Benutzer in der gleichen Gruppe sind, F.group_user_id <> '10' immer wahr sein wird.

3

Eine andere Version, die Post-Aggregat-Filterung verwendet. Denken Sie daran: WHERE filtert Zeilen mit Filtergruppen.

SELECT 
    G.group_id, 
    G.group_owner_id, 
    G.group_name, 
    G.group_title, 
    G.group_cover, 
    F.group_oid, 
    F.group_user_id 
FROM group_users F 
INNER JOIN groups G 
    ON G.group_id = F.group_oid 
    WHERE G.status = '1' 
GROUP BY 
    F.group_oid 
    HAVING SUM(F.group_oid = 10)=0 
    AND SUM(F.group_user_id = 10)=0 
ORDER BY rand() 
LIMIT 2 
Verwandte Themen