2013-04-24 63 views
0

我有一个SQL查询的问题,我会尝试解释我想要做什么。这是我的查询返回一些结果行。如何在MySql中获取组中的特定部分?

SELECT 
sck.sckid, 
sck.prid, 
sck.paid, 
sck.sckcen, 
sum(scd.scdkiek) as count_of_goods, 
min(scn.scndat) as `date` 
FROM sck 
INNER JOIN scd ON scd.sckid = sck.sckid 
INNER JOIN scn ON scn.scnid = scd.scnid 
INNER JOIN sandeliai ON sandeliai.paid = sck.paid 
WHERE sck.prid = 1376 GROUP BY sckid 

而且该查询返回“表1”的结果:

表1:

sckid | prid | sckcen | count_of_goods |  date  | 
123  | 1376 | 10009  |   0   | 2012-12-31 | 
124  | 1376 | 10007  |   15   | 2013-01-25 | 
125  | 1376 | 10005  |   0   | 2013-02-13 | 
126  | 1376 | 10000  |   18   | 2013-03-15 | 

但我只需要一行与prid分组的所有数据,我写此查询:

SELECT 
sck.sckid, 
sck.prid, 
sck.paid, 
sck.sckcen, 
sum(scd.scdkiek) as count_of_goods, 
min(scn.scndat) as `date` 
FROM sck 
INNER JOIN scd ON scd.sckid = sck.sckid 
INNER JOIN scn ON scn.scnid = scd.scnid 
INNER JOIN sandeliai ON sandeliai.paid = sck.paid 
WHERE sck.prid = 1376 GROUP BY prid 

然后我在表格中得到一行这个数据:

表2:

sckid | prid | sckcen | count_of_goods |  date  | 
123  | 1376 | 10009  |   23   | 2012-12-31 | 

这似乎是正确的,但在date领域,我需要从表中的一个,其中有count_of_goods> 0回到最早期的日期,所以对我来说需要这样的结果:

表3:

sckid | prid | sckcen | count_of_goods |  date  | 
123  | 1376 | 10009  |   23   | 2013-01-25 | 

所以,任何想法我怎么能得到像表3中的结果?

+0

它的数据类型,但对我来说最需要从较早的日期表1,其中count_of_goods> 0 – 2013-04-24 06:48:40

+0

尝试'MAX(scn.scndat)'。 – 2013-04-24 06:52:15

+0

使用count_of_goods> 0按日期排序 – sandeepKumar 2013-04-24 07:09:28

回答

1

尝试使用having,像

SELECT 
sck.sckid, 
sck.prid, 
sck.paid, 
sck.sckcen, 
sum(scd.scdkiek) as count_of_goods, 
min(scn.scndat) as `date` 
FROM sck 
INNER JOIN scd ON scd.sckid = sck.sckid 
INNER JOIN scn ON scn.scnid = scd.scnid 
INNER JOIN sandeliai ON sandeliai.paid = sck.paid 
WHERE sck.prid = 1376 GROUP BY prid HAVING count_of_goods > 0; 

这应该为你工作。这可能会跳过count = 0的行,我认为这应该没问题(只是我个人的意见)。

请以此为出发点,而不是最终解决方案。

编辑:与别名

+2

您可以在'HAVING'中使用count_of_goods,因为它使用'GROUP'ed结果集中的列,所以别名'count_of_goods'是有效的,并且比'HAVING SUM ...)' – 2013-04-24 07:18:41

+0

感谢您澄清@ Simonatmso.net。我删除了关于生效条款的陈述。 – 2013-04-24 07:23:24

0

有更新的总和(...)我现在我的问题是不是很合乎逻辑的我尝试这两种查询在我的问题,然后我得到一个很好的答案相结合,这是我的解决方案:

SELECT 
sck.sckid, 
sck.prid, 
sck.paid, 
sck.sckcen, 
sum(scd.scdkiek) as count_of_goods, 
(SELECT 
scn.scndat 
FROM sck 
INNER JOIN scd ON scd.sckid = sck.sckid 
INNER JOIN scn ON scn.scnid = scd.scnid 
WHERE sck.prid = 1376 GROUP BY sck.sckid having sum(scd.scdkiek) > 0 ORDER BY scn.scndat LIMIT 1) as `date` 
FROM sck 
INNER JOIN scd ON scd.sckid = sck.sckid 
INNER JOIN scn ON scn.scnid = scd.scnid 
WHERE sck.prid = 1376 GROUP BY prid; 
1

我认为我最初回来的答案可能已经非常复杂。假设scd.scdkiek是数字,是不是ID,那么你可能会得到你想要通过简单地改变INNER JOIN的标准是什么,即

SELECT 
    sck.sckid, 
    sck.prid, 
    sck.paid, 
    sck.sckcen, 
    scn.scndat, 
    SUM(scd.scdkiek) AS count_of_goods 
FROM sck 
INNER JOIN scd 
    ON scd.sckid = sck.sckid 
    AND scd.scdkiek > 0 
INNER JOIN sandeliai 
    ON sandeliai.paid = sck.paid 
INNER JOIN scn 
    ON scn.scnid = scd.scnid 
WHERE sck.prid = 1376 
GROUP BY 
    sck.prid 

做不到这一点,虽然我会考虑使用子查询。子查询将计算每行count_of_goods。然后,外部查询将使用它来决定是否将该行的日期设置为NULL。 MIN(... somedate ...,NULL)将返回日期。这反过来将意味着你应该得到该行的count_of_goods不为NULL的最小日期。

当您正在查找count_of_goods> 0的日期时,子查询按日期分组。

这仅仅是一个当然的选择,可能还有其他更有效的方法,但我相信这会按照你的目标是要做到

SELECT 
    sck.sckid, 
    sck.prid, 
    sck.paid, 
    sck.sckcen, 
    SUM(d.count_of_goods) AS count_of_goods, 
    MIN(IF(d.count_of_goods>0,d.scndat,NULL)) AS `date` 
FROM (
    -- Get the data and group it by date 
    SELECT 
     sck.sckid, 
     sck.prid, 
     sck.paid, 
     sck.sckcen, 
     scn.scndat, 
     SUM(scd.scdkiek) AS count_of_goods 
    FROM sck 
    INNER JOIN scd ON scd.sckid = sck.sckid 
    INNER JOIN sandeliai ON sandeliai.paid = sck.paid 
    INNER JOIN scn ON scn.scnid = scd.scnid 
    WHERE sck.prid = 1376 
    GROUP BY 
     sck.prid, -- may not really be needed 
     scn.scndat 
) AS d 
GROUP BY d.prid 
相关问题