我被认为如何从表格中制作一个复杂的(我认为)SELECT查询,其中包含3种评论(第一个 - 正面评论,第二个 - 负面评论和第三个 - 中立评论)。使用PHP我想SELECT和diplay第一个负面评论,并在负面评论之后显示所有其他类型的评论。如何使用一个SELECT查询以及我用来分隔分页的LIMIT来显示它们?
表格示例:
id - unique id
type - (value 1-positive, 2-negative, 3-neutral)
text - value
我首先想到SELECT * FROM comments WHERE type='2' ORDER BY id LIMIT 0,100
while(){
...
}
在第二次之后
SELECT * FROM commetns WHERE type!='2' ORDER BY id LIMIT 0,100
while(){
...
}
但如果有两个不同的SELECT查询,如何使用LIMIT进行分页?
答案 0 :(得分:2)
使用UNION和LIMIT的组合。 但是,您需要确定绑定变量,并指定要显示的行数。
(SELECT * FROM comments WHERE type = '2' LIMIT ?)
UNION
(SELECT * FROM comments WHERE type != '2' LIMIT ?);
SQLFiddle:http://sqlfiddle.com/#!9/6d682/1
答案 1 :(得分:1)
在ORDER BY子句中使用IF语句将类型2更改为首先排序: -
SELECT *
FROM comments
ORDER BY IF(type = 2, 0, type)
LIMIT 1, 20
这将首先给出所有否定(类型2)注释,然后是其他注释(无论是正面还是中性)。您可能希望为排序的一致性添加额外的列。
答案 2 :(得分:1)
我没有完全了解您的情况,但我认为您可以使用OR
运算符来获取您想要的内容:
SELECT * from comments WHERE type=2 OR type=-2 ORDER BY type DESC
答案 3 :(得分:0)
我必须缺少上下文,否则你可以使用:
SELECT * from comments ORDER BY type ASC LIMIT 0,10
因此,通过订购类型,您将首先获得类型1的所有项目,然后是2和3。
只要使用限制就会将它们切成你想要的部分,它仍然会尊重订单。
答案 4 :(得分:0)
您可以使用union来合并表组,但是在所有表中必须具有相同的列,例如:
select commetns,'nagtive' as type from nagtive_tbl limit 10
union
select commetns,'positive' as type from positive_tbl limit 10
union
select commetns,'neutral' as type from neutral_tbl limit 10
此查询返回表包含每行包含的不同表中的所有注释,因此您可以在客户端上构建列表时对其进行过滤。