如何优化我的mysql查询

时间:2016-03-30 02:33:08

标签: mysql sql

我有两张桌子:vehicle_c2c_car_source和vehicle_c2c_appoint_task。 vehicle_c2c_car_source的结构:

/ ******** /

`id` int(11) NOT NULL AUTO_INCREMENT
`title` varchar(200) NOT NULL DEFAULT

/ ********* /

vehicle_c2c_appoint_task

/ ********* /

`id` int(11) unsigned NOT NULL AUTO_INCREMENT
`car_source_id` int(11) NOT NULL DEFAULT '0'
`status` tinyint(4) NOT NULL DEFAULT '0'

状态值可以是0,1,2。一个car_source_id可以有很多状态。

第一个目标是获取状态记录数量小于3的所有car_source。

第二个目标是在状态等于1时获取状态记录的数量。

输出应该是这样的:

22222(状态记录的id)1111(car_source_id)title(title)4(status = 1时的状态记录量)

我目前的解决方案是首先获得满足第一个目标的所有car_source,然后在循环中查询vehicle_c2c_appoint_task表以完成第二个目标。

SELECT cs.id, pt.car_source_id, cs.title, 
FROM vehicle_c2c_car_source AS cs
JOIN vehicle_c2c_appoint_task AS pt ON cs.id = pt.car_source_id
WHERE 1
AND pt.appoint_status NOT IN (2,6)
GROUP BY pt.car_source_id HAVING count(pt.car_source_id) < 3

在循环中:

SELECT count(*) as count 
FROM vehicle_c2c_appoint_task 
WHERE status = 1
group by car_source_id

我认为将查询放在循环中并不是一个好主意。如何在一个查询中获得所有价值?

1 个答案:

答案 0 :(得分:0)

你的问题很难理解。但是您可以在SELECTHAVING子句中使用条件聚合来组合这两个查询:

SELECT cs.id, pt.car_source_id, cs.title, SUM(status = 1) as cnt
FROM vehicle_c2c_car_source cs JOIN
      vehicle_c2c_appoint_task pt
      ON cs.id = pt.car_source_id
GROUP BY pt.car_source_id
HAVING SUM(pt.appoint_status NOT IN (2, 6)) < 3;