2013-04-24 65 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 
相關問題