2016-12-10 2 views
0

beitreten Zuerst tut mir leid, mein falsches Englisch.MySQL links mit 'b's Limit

Ich habe eine Frage für mysql Abfrage mit b.limit zeigen unter zwei Tisch

Tabelle 1 beitreten: Mitglieder

id INT NOT NULL PRIMARY KEY
user_name VARCHAR (100) NOT NULL
...

Tabelle 2: Members_opt

id INT NOT NULL PRIMARY KEY
members_id VARCHAR (100) NOT NULL
Kategorie VARCHAR (10) NOT NULL
...

und einen Benutzer habe mehrere Spalten von Members_opt. und Members.id = Members_opt.members_id.

ich machen möchte diese Abfrage

SELECT * FROM Mitglieder ein, Members_opt b WHERE a.id = b.members_id;

Aber diese Abfrage führt zum Ergebnis unten.

id | user_name | category 
01 | John | cat 
01 | John | dog 
01 | John | bird 
02 | olion | cat 
03 | jenny | dog 

Ich möchte, wenn das Ergebnis gleichen ID-Wert hat, fügen Sie einfach „limit 0,1“ bis zur Kategorie so dass ich dieses Ergebnis will.

01 | John | cat 
02 | olion | cat 
03 | jenny | dog 

Wie kann ich das erreichen?

Antwort

-2

können Sie eine group by-Klausel verwenden:

SELECT * 
FROM Members a, Members_opt b 
WHERE a.id = b.members_id 
GROUP BY a.id 

Aber wenn Sie diese verwenden, kann jeder Eintrag von b ausgewählt werden. Es wird nicht gesagt, dass ID 01 immer den Eintrag 'cat' von Tabelle b erhält.

+0

Ja! ich mag das! ich will das. Das Problem lösen :) Danke Akrys! –

+0

Kann ich einen "ORDER BY b.id ASC" hinzufügen? –

+0

Sie können jede 'order by' direkt nach der 'group by'-Klausel hinzufügen, sie würde aussehen wie' GROUP BY a.id ORDER BY b.id ASC '. Ich bin mir nicht sicher, ob es nützlich wäre – akrys

2

Die Operation JOIN zeigt alle möglichen Kombinationen von Zeilen in den beiden Tabellen. Also, wenn John einen Hund, eine Katze und einen Vogel hat und du einen gewöhnlichen JOIN machst, bekommst du drei Reihen für John.

(SELECT .. FROM a,b WHERE a.something=b.something ist ein JOIN. Es verwendet altmodische Syntax, ist aber immer noch eine JOIN).

Um Ihre Anforderung zu erfüllen, benötigen Sie eine Möglichkeit, eine virtuelle Tabelle (eine Unterabfrage) mit nur einem Tier pro Mitglied zu erhalten.

   SELECT members_id, 
         MAX(category) category 
       FROM Members_opt 
       GROUP BY members_id 

wird das tun. Es wählt die Kategorie (Haustier) mit dem Namen aus, der als letztes im Alphabet erscheint. Es gibt höchstens eine Zeile pro Wert von members_id zurück.

Dann verbinden Sie diese virtuelle Tabelle (Unterabfrage) mit Ihrer anderen Tabelle.

Dies wird eine Zeile für jedes Mitglied mit der gewählten Kategorie zurückgeben. Wenn ein Mitglied keine Kategorien (keine Haustiere) hat, unterdrückt diese Abfrage die Zeile dieses Mitglieds. Wenn Sie möchten, dass Ihre Abfrage Mitglieder ohne Haustiere anzeigt, verwenden Sie LEFT JOIN.

Hinweis, dass diese Abfrage

SELECT * /* incorrect: nonstandard, unpredictable */ 
    FROM Members a, Members_opt b 
    WHERE a.id = b.members_id 
    GROUP BY a.id 

mißbraucht eine Nicht-Standard-Erweiterung bis zur Umsetzung von GROUP BY MySQL. Es wird in neueren Versionen von MySQL nicht funktionieren, aber stattdessen wird ein Fehler auftreten. Es wird, wenn es überhaupt funktioniert, unvorhersehbare Ergebnisse liefern. Lesen Sie dies. https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

Die Rückgabe unvorhersehbarer Ergebnisse ist schlimmer als die Rückgabe zufälliger Ergebnisse. Wenn Sie diesen Hack GROUP BY in MySQL missbrauchen, gibt jede nachfolgende Verwendung der Abfrage die gleichen Ergebnisse zurück, bis dies nicht geschieht.

+0

vielen Dank ich muss die Verwendung von "Gruppe von" lernen. –