2016-03-30 20 views
0

Ich habe zwei Tabellen: vehicle_c2c_car_source und vehicle_c2c_appoint_task. Die Struktur vehicle_c2c_car_source:wie ich meine mysql Abfrage optimieren kann

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

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

Die v alue des Status kann 0,1,2 sein. Eine car_source_id kann viele Status haben.

Das erste Ziel ist es, alle car_source zu erhalten, die die Menge der Statussätze kleiner als 3

Das zweite Ziel, die Höhe der Statussätze zu erhalten ist, wenn der Status auf 1.

gleich

Die Ausgabe sollte so etwas wie:

22222 (id von Statussätzen) 1111 (car_source_id) Titel (Titel) 4 (Menge der Statussätze, wenn Status = 1)

Meine aktuelle Lösung zuerst zu bekommen all die car_source dass ich et das erste Ziel und dann vehicle_c2c_appoint_task Tabelle in einer Schleife abfragen, um das zweite Ziel zu erreichen.

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 

In der Schleife:

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

Ich denke, dass es keine gute Idee ist, die Abfrage in einer Schleife zu setzen. Wie kann ich den gesamten Wert in einer Abfrage erhalten?

Antwort

0

Ihre Frage ist schwer zu folgen. Aber man kann die beiden Abfragen kombiniert bedingte Aggregation verwenden, sowohl in den SELECT und die HAVING Klausel:

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 (Status = 1) hat den Trick, dank – user3210341