2012-07-29 34 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