2016-12-10 60 views
0

首先,我很抱歉對我錯誤的英語。MySQL左加入'b的限制

我對MySQL查詢一個問題與b.limit 顯示以下兩條表

表1加入:會員

ID INT NOT NULL PRIMARY KEY
USER_NAME VARCHAR(100) NOT NULL
...

表2:Members_opt

ID INT NOT NULL PRIMARY KEY
members_id VARCHAR(100)NOT NULL
類別VARCHAR(10)NOT NULL
...

和一個用戶有多個Members_opt列。 和Members.id = Members_opt.members_id。

我想使這個查詢

SELECT * FROM成員,Members_opt B,其中a.id = b.members_id;

但是,這個查詢使得下面的結果。

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

我想,如果有結果值相同的id,只是「極限0,1」添加到 類,所以我想這個結果。

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

我該如何做到這一點?

回答

-2

您可以使用group by條款:

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

但是如果你用這個,可以選擇B的任何條目。沒有說,ID 01總是從表b中獲得條目'貓'。

+0

是的!我喜歡!我要這個。 問題解決了:)謝謝akrys! –

+0

如果我可以添加一個「ORDER BY b.id ASC」? –

+0

您可以在'group by'子句後添加任意'order by',它看起來就像是'GROUP BY a.ID ORDER BY b.id ASC'。我不確定,如果它會有用 – akrys

2

JOIN操作提供了兩個表中所有行的可能組合。所以,如果約翰有一隻狗,貓和鳥,並且你做了一個普通的加入,你會得到約三排。

SELECT .. FROM a,b WHERE a.something=b.somethingJOIN。它使用老式的語法,但仍然是JOIN)。

爲了滿足您的需求,您需要一種獲得每個成員只包含一個寵物的虛擬表(子查詢)的方法。

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

會這樣做。它選擇名字最後一個字母的類別(寵物)。它每個值的members_id最多返回一行。

然後,將該虛擬表(子查詢)加入到其他表中。

SELECT a.id, a.user_name, b.category 
    FROM Members a 
    JOIN (
       SELECT members_id, 
         MAX(category) category 
       FROM Members_opt 
       GROUP BY members_id 
     ) b ON a.id = b.members_id 

這將返回一行顯示所選類別的每個成員。如果一個成員沒有類別(沒有寵物),這個查詢將會抑制該成員的行。如果您希望查詢顯示沒有寵物的成員,請使用LEFT JOIN。

注意這個查詢

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

誤用一個非標準擴展MySQL的執行GROUP BY。它不適用於較新版本的MySQL,而是會出錯。如果它確實起作用,它將返回不可預知的結果。讀這個。 https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

返回不可預知的結果比返回隨機結果更差。當你在MySQL中濫用這個GROUP BY黑客時,每個後續的查詢使用返回相同的結果,直到它不。

+0

非常感謝你 我必須學習使用「group by」。 –