2016-11-23 169 views
0

嗨需要一些帮助,MySQL查询MySQL查询优化

我的数据是,像这样

Table base_status 

| id | order_id | status | dt_added | 
------------------------------------- 
| 1 | 123  | xyz | date3 | 
| 2 | 123  | abc | date2 | 
| 3 | 123  | pqr | date1 | 

我试图让输出等

| order_id | xyz_date | abc_date | pqr_date | 
------------------------------------------- 
| 123  | date3 | date2 | date3 | 

MySQL查询:

select BS.order_id, XYZ.dt_added AS xyz_date, 
     ABC.dt_added AS abc_date, PQR.dt_added AS pqr_date, 
from base_status BS 
LEFT JOIN base_status XYZ ON BS.order_id=TAS.order_id and TAS.status='xyz' 
LEFT JOIN base_status ABC ON BS.order_id=TAS.order_id and TAS.status='abc' 
LEFT JOIN base_status PQR ON BS.order_id=PQR.order_id and PQR.status='pqr' 
.... 

我的问题:如何避免3个左连接。只有一个连接有什么可做的吗?

回答

1

,最好的办法不是多次查询同一个表是用GROUP_CONCAT到组的三个日期,并FIELD保持一个挂单:

SELECT order_id, GROUP_CONCAT(dt_added) AS "xyz_date,abc_date,pqr_date " 
FROM base_status 
WHERE status IN ('xyz', 'abc', 'pqr') 
GROUP BY order_id 
ORDER BY FIELD(status, 'xyz', 'abc', 'pqr') 

当然,其结果将是SLI从你想达到什么样的ghtly不同:

| order_id | xyz_date,abc_date,pqr_date | 
----------------------------------------- 
| 123  | date3,date2,date1   | 
0

试试这个

SELECT 
    order_id, GROUP_CONCAT(status), GROUP_CONCAT(dt_added) 
FROM 
    base_status 
GROUP BY 
    order_id 

为了得到输出这样

| order_id | status  | dt_added    | 
---------------------------------------------------- 
| 123  | xyz, abc, pqr | date3, date2, date1 | 
0

如果你有超过3个日期,动态支点是去

SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(case when dt_added = ''', 
     dt_added , 
     ''' then dt_added end) AS ', 
     CONCAT(status,'_','date') 
    ) 
) INTO @sql 
from base_status; 

SET @sql = CONCAT('SELECT order_id, ', @sql, ' from base_status 
group by order_id'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

FIDDLE

0

您可以使用都汇集功能与IF语句结合带回列作为你的方式注明: -

SELECT order_id, 
     MAX(IF(status = 'xyz', dt_added, NULL)) AS xyz_date, 
     MAX(IF(status = 'abc', dt_added, NULL)) AS abc_date, 
     MAX(IF(status = 'pqr', dt_added, NULL)) AS pqr_date 
FROM base_status 
GROUP BY order_id 

但是我怀疑,如果得到适当的索引的3表连接应该执行罚款。