2012-07-29 69 views
0

假設我有一個像這樣的查詢:如何將LEFT JOIN限制爲一個結果並返回結果集中的最低值?

SELECT t1.name, t2.likes 
FROM table_1 t1 
LEFT JOIN table_2 t2 ON t1.name = t2.name 

怎麼可能LEFT JOIN進行修改,以使其做到以下幾點:

SELECT likes FROM table_2 WHERE name = [name from table 1] ORDER BY likes ASC 

我試着寫一個子查詢,但沒有奏效因爲(我認爲)你不能在子查詢中使用子查詢之外的變量(例如名稱)(名稱不是常量,因爲查詢的結果集不止一個)。

這可能嗎?

編輯:表將是這樣的:

TABLE_1:

+------+--------+ 
| id | name | 
+------+--------+ 
| 0 | cat | 
| 1 | dog | 
+------+--------+ 

表2:

+------+--------+---------+ 
| id | name | likes | 
+------+--------+---------+ 
| 0 | cat | 23 | 
| 1 | cat | 2  | 
| 2 | cat | 53 | 
| 3 | dog | 25 | 
| 4 | dog | 12 | 
+------+--------+---------+ 

那麼,我希望是:

+--------+---------+ 
| name | likes | 
+--------+---------+ 
| cat | 2  | 
| dog | 12 | 
+--------+---------+ 
+0

你想要最小v每個'name'的'likes'列都有嗎?請澄清:你想回答什麼樣的問題? – 2012-07-29 00:10:35

+0

@ZaneBien - 我用示例表更新了我的問題。是的,我想要每個名字的最小喜歡。 – Nate 2012-07-29 00:26:30

+0

好的,我的第一個解決方案應該是您嘗試實現的最簡單的解決方案。如果你所需要的只是'name'和最少的'likes',你就不需要連接。 – 2012-07-29 00:28:12

回答

3
SELECT 
    t1.name, t2.likes 
FROM table_1 t1 
LEFT JOIN (
    SELECT 
    name, 
    MIN(likes) as likes 
    FROM table_2 
    GROUP BY name 
) as t2 ON t1.name = t2.name 

你可以用一個子查詢做到這一點,但我認爲這將是更慢:

SELECT 
    t1.name, 
    (SELECT MIN(likes) FROM table_2 WHERE table_2.name = t1.name) 
FROM table_1 t1 
2

最低likes每名:

SELECT name, MIN(likes) AS likes 
FROM  table_2 
GROUP BY name 

如果您需要了解的name更多信息,做一個加盟到table_1表,將上述查詢合併到子查詢中:

SELECT a.name, b.likes 
FROM table_1 a 
LEFT JOIN 
(
    SELECT name, MIN(likes) AS likes 
    FROM  table_2 
    GROUP BY name 
) b ON a.name = b.name