MySql查询:从表中为每个类别选择前3行
我有一个包含记录的表,它有一行名为category。我插入了太多的文章,我只想从每个类别中选择两篇文章 我试着这样做: 我创建了一个视图:MySql查询:从表中为每个类别选择前3行,mysql,view,limit,Mysql,View,Limit,我有一个包含记录的表,它有一行名为category。我插入了太多的文章,我只想从每个类别中选择两篇文章 我试着这样做: 我创建了一个视图: CREATE VIEW limitrows AS SELECT * FROM tbl_artikujt ORDER BY articleid DESC LIMIT 2 然后我创建了这个查询: SELECT * FROM tbl_artikujt WHERE artikullid IN ( SELECT artikul
CREATE VIEW limitrows AS
SELECT * FROM tbl_artikujt ORDER BY articleid DESC LIMIT 2
然后我创建了这个查询:
SELECT *
FROM tbl_artikujt
WHERE
artikullid IN
(
SELECT artikullid
FROM limitrows
ORDER BY category DESC
)
ORDER BY category DESC;
但这不起作用,只给我两条记录?限制只会停止语句返回的结果数。您正在寻找的通常称为分析/窗口/排名函数-MySQL不支持该函数,但您可以使用变量进行模拟:
SELECT x.*
FROM (SELECT t.*,
CASE
WHEN @category != t.category THEN @rownum := 1
ELSE @rownum := @rownum + 1
END AS rank,
@category := t.category AS var_category
FROM TBL_ARTIKUJT t
JOIN (SELECT @rownum := NULL, @category := '') r
ORDER BY t.category) x
WHERE x.rank <= 3
如果不更改SELECT x*,结果集将包括秩和var_类别值-如果不是这种情况,则必须指定真正需要的列。使用group by而不是order by。效果很好,这就是我需要的。我可以通过此选择以某种方式创建视图吗,我试过了,但它说:1349-View的SELECT在FROM中包含一个子查询clause@AXheladini:很抱歉,MySQL将不允许它,原因如下-子查询,使用变量。。。恐怕MySQL视图受到了极大的限制——它们在创建视图文档中列出了限制:对我来说,这似乎是从每个类别中选择了前三名,就好像它是按t.category ASC、t.articleid ASC排序的一样,但你如何选择它作为t.category ASC、t.articleid DESC呢?阅读本文:组的前N名:
SELECT * FROM (
SELECT VD.`cat_id` ,
@cat_count := IF( (@cat_id = VD.`cat_id`), @cat_count + 1, 1 ) AS 'DUMMY1',
@cat_id := VD.`cat_id` AS 'DUMMY2',
@cat_count AS 'CAT_COUNT'
FROM videos VD
INNER JOIN categories CT ON CT.`cat_id` = VD.`cat_id`
,(SELECT @cat_count :=1, @cat_id :=-1) AS CID
ORDER BY VD.`cat_id` ASC ) AS `CAT_DETAILS`
WHERE `CAT_COUNT` < 4
------- STEP FOLLOW ----------
1 . select * from ( 'FILTER_DATA_HERE' ) WHERE 'COLUMN_COUNT_CONDITION_HERE'
2. 'FILTER_DATA_HERE'
1. pass 2 variable @cat_count=1 and @cat_id = -1
2. If (@cat_id "match" column_cat_id value)
Then @cat_count = @cat_count + 1
ELSE @cat_count = 1
3. SET @cat_id = column_cat_id
3. 'COLUMN_COUNT_CONDITION_HERE'
1. count_column < count_number
4. ' EXTRA THING '
1. If you want to execute more than one statement inside " if stmt "
2. IF(condition, stmt1 , stmt2 )
1. stmt1 :- CONCAT(exp1, exp2, exp3)
2. stmt2 :- CONCAT(exp1, exp2, exp3)
3. Final "If" Stmt LIKE
1. IF ( condition , CONCAT(exp1, exp2, exp3) , CONCAT(exp1, exp2, exp3) )
share