iT邦幫忙

0

MySQL GROUP取值問題

假設欄位如下
id name date
1 a 2010-05-11
2 a 2010-05-20
3 a 2010-05-12
4 b 2010-05-30
5 b 2010-05-05

我想要在使用name當group之後以最近日期取出id跟name
也就是說上述結果應該為
2 a
4 b

請問該怎麼下?

2 個回答

8
fillano
iT邦超人 1 級 ‧ 2010-05-29 21:03:40
最佳解答
<pre class="c" name="code">
SELECT id, name, `date`
FROM (
  SELECT * 
  FROM tableXX
  ORDER BY `date` DESC
) AS a
GROUP BY name

不過我不太確定你的意思,沒有取date的話,對name做group by,怎樣都對阿?你是不是稍微解釋一下你的需求?

看更多先前的回應...收起先前的回應...
chan15 iT邦新手 5 級 ‧ 2010-05-29 21:14:59 檢舉

因為用group的話,id他會使用第一筆,即便是order by date,但我想要抓出是最新日期的那一筆id,而不是第一筆id

chan15 iT邦新手 5 級 ‧ 2010-05-29 21:23:30 檢舉

我講一下完整的需求好了
這是客戶的報表,客戶報表沒有用所謂的分類,但名稱會重複,所以名稱變成了分類(不是我規劃的…)
所以某會員所有的報表,可能有的是
a
a
b
b
c
c
a
a
以分類來說就是
a
b
c
而date是publish date,所以不一定id越大等於pulish date越大,因此也不能用MAX(id)
所以我要在以name為group的架構下,抓出我想要得那筆資料所有對得欄位

chan15 iT邦新手 5 級 ‧ 2010-05-29 21:45:50 檢舉

其實這樣可以作到啦,不過要篩選的欄位不只一個,用一堆子查詢總覺得不是好事

<pre class="c" name="code">SELECT s1.s_name, (SELECT s2.s_id FROM tbl_sort s2 WHERE s2.s_name = s1.s_name ORDER BY s2.s_date DESC LIMIT 0, 1) AS newId
FROM tbl_sort s1
WHERE s1.m_id = 1
GROUP BY s1.s_name
ORDER BY s1.s_date DESC
fillano iT邦超人 1 級 ‧ 2010-05-31 00:36:00 檢舉

我答案裡面的第一個select把date拿掉不就行了?

<pre class="c" name="code">
SELECT id, name 
FROM (
  SELECT * 
  FROM tableXX
  ORDER BY `date` DESC
) AS a
GROUP BY name
4
pojen
iT邦新手 2 級 ‧ 2010-05-30 10:16:48

WITH POPO AS(
SELECT ID,
, NAME
ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DATE DESC) RN
FROM MYTABLE
)
SELECT ID, NAME
FROM POPO
WHERE RN = 1

chan15 iT邦新手 5 級 ‧ 2010-05-30 16:25:11 檢舉

1 a x1 y1 2010-05-01
2 a x2 y2 2010-05-30
3 a x3 y3 2010-05-20
4 b x4 y4 2010-05-12
5 b x5 y5 2010-05-23

2 a x2 y2
5 b x5 y5

chan15 iT邦新手 5 級 ‧ 2010-05-30 16:25:25 檢舉

下面是想要的結果

fillano iT邦超人 1 級 ‧ 2010-05-31 00:36:57 檢舉

雖然MySQL現在是Oracle的產品,但是他還沒支援這些語法吧?

我要發表回答

立即登入回答