Mysql - 獲取每個分類下面前幾條數據

經常遇到一個表,有多個類別,每個類別,下面有多個小類別,每個小類別下面又有多條記錄的情況,要求取出每個大類別下面的三條記錄。

數據庫;

CREATE TABLE `NewTable` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`acar_id`  int(11) NOT NULL ,
`ascore_id`  int(11) NOT NULL COMMENT '車型評分ID' ,
`score`  int(11) NOT NULL COMMENT '評分' ,
`type`  int(11) NOT NULL COMMENT '類型(101視覺設計,102觸覺質感,103靜謐性,211駕駛員頭部空間)' ,
`content`  varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '評價' ,
`photo`  varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '圖片' ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
COMMENT='車型評分詳情'
AUTO_INCREMENT=1051
ROW_FORMAT=COMPACT


數據:



需求

對於一個acar_id下面,只顯示3小項(視覺設計、觸覺質感、靜謐性,若該三項未被評價,則順序後推顯示)及3小所屬的大項名稱及大項分數,點擊“全部內容”“文字描述”“圖”時,新開標籤頁查看全部內容

答案:

SELECT b.`acar_id`,b.`id`  ,b.`id` % 3,CONCAT(b.`acar_id`, b.`id` % 3) FROM
 `appraise_score_detail` b
WHERE
	b.acar_id IN (29,30)
GROUP BY
	CONCAT(b.`acar_id`, b.`id` % 3)
ORDER BY
	b.id



解釋一下:

GROUP BY
	CONCAT(b.`acar_id`, b.`id` % 3)

如果上面的sql去除 group by是這樣的,

SELECT b.`acar_id`,b.`id`  ,b.`id` % 3,CONCAT(b.`acar_id`, b.`id` % 3) FROM
 `appraise_score_detail` b
WHERE
	b.acar_id IN (29,30)
ORDER BY
	b.id

效果:



將acar_id下面的數據通過CONCAT(b.`acar_id`, b.`id` % 3)分爲三種情況,然後在使用groupby


下面的鏈接是同樣的問題,不過是別的解決方案:

https://segmentfault.com/q/1010000011404345/a-1020000011404530

可以參考。



還有遇到過這種寫法的,可以提供思路。

第一種:

SELECT
a.*
FROM
appraise_score_detail a
LEFT JOIN appraise_score_detail b
on a.acar_id = b.acar_id  AND a.score > b.score
where a.acar_id IN (11, 12, 13)
GROUP BY a.id
HAVING COUNT(a.id)<3
ORDER BY a.acar_id desc


第二種:

SELECT
  a.*

FROM
  appraise_score_detail a
WHERE
  (SELECT COUNT(1)
   FROM appraise_score_detail b
   WHERE 
     a.acar_id = b.acar_id
     AND a.score >=b.score
  ) < 3;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章