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领域。我是否通过连接完成此操作?
status
是customer
表中的字段。
编辑查询:
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,所有结果都按预期返回。
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
都打败我吧。这将是去AVP的方式,尽管从您想要由c命令的问题的声音。状态第一 – 2012-02-10 19:14:37
我不是mySql的专家,但我很好奇,如果ORDER BY子句中有'c.status'的原因。 – 2012-02-10 19:16:09
如果你只想从动作表中得到结果,你可以选择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
另外,考虑不使用*
,而是列出你所需要的列。如果您需要选择少于所有列,那么它将提高性能,并且如果表格发生变化,您将来也不会感到意外。
您忘记了客户状态的附加订单 – 2012-02-10 19:17:06
@Paul谢谢,更正! – Icarus 2012-02-10 19:19:21
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中提到的。我认为它可以从两个查询中删除。
你忘记了客户状态的附加订单 – 2012-02-10 19:17:22
@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
这是一个过滤器的状态,所以我将需要编辑示例 – AVProgrammer 2012-02-10 20:08:04