2017-04-21 51 views
-2

我有下面的代碼,但我想通過date_available desc來安排它,並通過store_id對它進行分組,以便我只返回1個值。如何在mysql中按組排序?

SELECT 
product_to_store.store_id, 
product.date_available, 
product.product_id, 
product_description.name, 
product_to_category.category_id, 
pcd3.name, 
lvl2.parent_id, 
pcd2.name, 
CASE 
WHEN lvl2.parent_id > 0 THEN lvl1.parent_id 
ELSE 0 
END, 

pcd1.name, 
product.quantity, 
product_type.type 

FROM product 
inner join product_to_store on (product.product_id=product_to_store.product_id) 
inner join product_description on (product.product_id = product_description.product_id) 
inner join product_to_category on (product.product_id = product_to_category.product_id) 
inner join product_type on (product.product_id = product_type.product_id) 
inner join store on (product_to_store.store_id = store.store_id) 
inner join product_category as lvl2 on (product_to_category.category_id = lvl2.category_id) 
inner join product_category as lvl1 on (lvl1.category_id = lvl2.parent_id) 
inner join product_category_description as pcd3 on (pcd3.category_id = lvl2.category_id) 
inner join product_category_description as pcd2 on (pcd2.category_id = lvl2.parent_id) 
inner join product_category_description as pcd1 on (pcd1.category_id = lvl1.parent_id) 

樣品表:

store_id date_available name 
1   2017-05-04  T1 
1   0000-00-00  T2 
2   2017-06-04  T3 
3   0000-00-00  T4 
2   2017-04-04  T5 
3   0000-00-00  T6 

預期結果:

store_id date_available name 
1    2017-05-04 T1 
2    2017-06-04 T3 
3    0000-00-00 T4 

我如何能做到這一點在MySQL?請幫助我,謝謝你。

+0

簡化你的榜樣(https://stackoverflow.com/幫助/ MCVE)。不要忘記添加一些示例表格數據和預期結果 - 以及格式化文本! – jarlh

+0

如果兩個[date_available]是相同的呢?在你的例子中[store_id] 3有兩個記錄與[date_available]相同,我們應該選擇哪條記錄? – pblyt

+0

@pblyt只要拿到最頂就可以了 – CloudSeph

回答

0

使用此作爲提示:

-- Create some testing data 
IF OBJECT_ID('tempdb..#product') IS NOT NULL DROP TABLE #product 
CREATE TABLE #product(
    [store_id] int 
    ,[date_available] varchar(50) 
    ,[name] varchar(50) 
) 
INSERT INTO #product VALUES 
    (1, '2017-05-04', 'T1') 
    ,(1, '0000-00-00', 'T2') 
    ,(2, '2017-06-04', 'T3') 
    ,(3, '0000-00-00', 'T4') 
    ,(2, '2017-04-04', 'T5') 
    ,(3, '0000-00-00', 'T6') 

-- Get result 
SELECT p1.[store_id], p1.[date_available], MIN(p2.[name]) AS [name] 
    FROM (
     SELECT [store_id], MAX([date_available]) AS [date_available] FROM #product 
      GROUP BY [store_id] 
    ) p1 
    INNER JOIN #product p2 
     ON p1.[store_id] = p2.[store_id] AND p1.[date_available] = p2.[date_available] 
    GROUP BY p1.[store_id], p1.[date_available] 

-- Destroy the temp table 
DROP TABLE #product 

然後在你的長腳本,您可以將其改寫爲這樣的:

SELECT product_to_store.store_id, 
    product.date_available, 
    product.product_id, 
    . 
    . 
    . 
FROM product 
INNER JOIN ... 
INNER JOIN ... 
INNER JOIN (
    SELECT p1.[store_id], p1.[date_available], MIN(p2.[name]) AS [name] 
     FROM (
      SELECT [store_id], MAX([date_available]) AS [date_available] FROM #product 
       GROUP BY [store_id] 
     ) p1 
     INNER JOIN #product p2 
      ON p1.[store_id] = p2.[store_id] AND p1.[date_available] = p2.[date_available] 
     GROUP BY p1.[store_id], p1.[date_available] 
) store ON (product_to_store.store_id = store.store_id) 
INNER JOIN ... 
INNER JOIN ...