SQL - 我应该使用连接吗?

问题描述:

我有以下示例查询(MySQL的):SQL - 我应该使用连接吗?

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 

谢谢大家!


UPDATE

因为我有一些客户记录没有动作记录,内部联接未返回所有相关记录。我现在使用JOIN,所有结果都按预期返回。

+0

这是一个过滤器的状态,所以我将需要编辑示例 – AVProgrammer 2012-02-10 20:08:04

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 
+0

都打败我吧。这将是去AVP的方式,尽管从您想要由c命令的问题的声音。状态第一 – 2012-02-10 19:14:37

+2

我不是mySql的专家,但我很好奇,如果ORDER BY子句中有'c.status'的原因。 – 2012-02-10 19:16:09

+0

如果你只想从动作表中得到结果,你可以选择a。*,并且你可以在查询结尾添加一个GROUP BY a.id – 2012-02-10 19:16:11

是的,你可以用一个连接完成它,可能会更快:

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 

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

+0

您忘记了客户状态的附加订单 – 2012-02-10 19:17:06

+0

@Paul谢谢,更正! – Icarus 2012-02-10 19:19:21

+0

to @MikeChristensen的观点,你保证在查询的where子句中状态总是1,这使得对它的排序不必要... – 2012-02-10 19:45:44

您可以执行:

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中提到的。我认为它可以从两个查询中删除。

+0

你忘记了客户状态的附加订单 – 2012-02-10 19:17:22

+0

@Paul - 不是状态该查询中始终为1? – 2012-02-10 19:19:22

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