SQL - 我应该使用连接吗?

时间:2012-02-10 19:09:49

标签: mysql sql join

我有以下示例查询(MySQL):

SELECT * FROM `action` 
WHERE `customer_id` IN 
    (SELECT `id` FROM `customer` WHERE `status`=1)
ORDER BY
    action.date ASC
LIMIT 0, 10

我需要能够通过customer.status字段进行排序。我是通过加入来完成这个吗?

statuscustomer表格中的字段。


编辑查询:

SELECT * FROM `action` 
ORDER BY
    action.date ASC
LIMIT 0, 10

重要!

我正在通过PHP解析返回数据。运行修订后的查询后:

SELECT * FROM `action` a INNER JOIN `customer` c ON a.customer_id = c.id ORDER BY a.form_id ASC LIMIT 0, 10

我的PHP代码中断...


This post帮助了我。

我修改后的查询如下所示:

SELECT 
    *, a.id AS lead_id, c.id AS customer_id 
FROM 
    `action` a 
INNER JOIN 
    `customer` c ON a.customer_id = c.id 
ORDER BY c.status DESC

谢谢大家!


更新

因为我有一些没有行动记录的客户记录,所以INNER JOIN没有返回所有相关记录。我现在使用JOIN,所有结果都按预期返回。

4 个答案:

答案 0 :(得分:5)

SELECT * 
FROM `action` a
INNER JOIN `customer` c on a.`customer_id` = c.`id`
WHERE c.`status` in (1, 4, 7, 8)
ORDER BY a.date, c.status
LIMIT 0, 10 

答案 1 :(得分:2)

是的,您可以通过加入来完成它并且可能更快:

SELECT * FROM `action` a join customer c on c.id=a.customer_id
where c.status=1
ORDER BY
    a.date ASC
LIMIT 0, 10

另外,请考虑不使用*,而是列出您需要的列。如果您需要选择少于所有列,它将提高性能,如果表格发生变化,您将来不会感到意外。

答案 2 :(得分:2)

你可以这样做:

SELECT * FROM `action` a
INNER JOIN `customer` c on c.id = a.customer_id
WHERE c.status = 1
ORDER BY a.date ASC, c.status
LIMIT 0, 10

或者:

SELECT * FROM `action` a
INNER JOIN `customer` c on (c.id = a.customer_id and c.status = 1)
ORDER BY a.date ASC, c.status
LIMIT 0, 10

修改

值得指出的是c.status排序没有任何意义,因为它始终是1。但是,我把它放在那里,因为它是由其他人提出的以及OP中提到的。我认为可以从两个查询中删除它。

答案 3 :(得分:1)

SELECT * FROM `action` a 
JOIN `customer` c on a.customer_id=c.id 
WHERE c.status=1 order by a.date, c.status ASC 
LIMIT 0, 10