2017-04-21 50 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 ...