我有以下示例查询(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字段进行排序。我是通过加入来完成这个吗?
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
谢谢大家!
更新
因为我有一些没有行动记录的客户记录,所以INNER JOIN没有返回所有相关记录。我现在使用JOIN,所有结果都按预期返回。
答案 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