2016-03-30 10 views
0

を最適化する方法を私は2つのテーブルを持っています。 vehicle_c2c_car_sourceの構造:私のmysqlのクエリ

/********************************/

`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' 

vステータスの値は0,1,2とすることができます。 1つのcar_source_idは多くのステータスを持つことができます。

最初の目標は、ステータスレコードの量が3未満

第二の目標は、ステータスが1

に等しいときに、ステータスレコードの量を得ることですすべてcar_sourceを得ることです

出力する必要があることのようなもの:

22222(ステータスレコードのID)1111(car_source_id)タイトル(タイトル)

私の現在のソリューションを取得する最初である4(ステータス= 1は、ステータスレコードの量)すべて私のcar_source第1の目標を達成し、次いで、第2の目標を達成するためにループ内のテーブル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

あなたの質問は従うことが困難です。しかし、あなたは、両方のSELECTで、条件付きの集約を使用して2つのクエリを組み合わせることができますし、HAVING句:

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

SUM(ステータス= 1)は、おかげでトリックをしました – user3210341