2014-12-04 93 views
1

数据我有一个MySQL表称为评论单个SQL查询来检索特定的顺序(不ASC/DESC)

review_id, product_id, language_id, rating, review, author 

LANGUAGE_ID范围从1至10 10种不同的语言。

比方说,我确定我的访问者使用的语言id为4

有编写一个查询的方式浏览网站: 1.首先抓住当前语言 该产品的评论2.接下来,抓住其他语种的该产品按语言分类

所以评论,基本上是使用以下2个查询的作业运行一个接一个:

SELECT * FROM reviews WHERE product_id = 723 AND language_id = 4; 
SELECT * FROM reviews WHERE product_id = 723 AND language_id != 4 ORDER BY language_id ASC; 
+0

mm .. UNION可能是? – sectus 2014-12-04 10:16:07

+0

我想UNION会结合这两个查询。但是,性能是否仍然很低,即相当于2个查询?我想我的目标是只访问一次表,因为两个查询都在同一个表上运行。 – OC2PS 2014-12-04 10:18:13

+0

所以,在服务器端重新排序。 – sectus 2014-12-04 10:19:38

回答

2
SELECT * FROM reviews WHERE product_id = 723 
order by case when language_id = 4 then 0 else 1 end, language_id; 
+0

谢谢!这看起来有希望。将尝试,然后接受答案。与此同时,除了http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html,我可以在哪里阅读有关排序顺序的内容,这对我来说有点密集? – OC2PS 2014-12-04 10:22:18

+1

@ OC2PS不客气。你发布的链接有足够的信息。像任何其他标量函数一样考虑CASE-WHEN-ELSE-END,但是要使用特定的语法。例如SUBSTRING。你可以在任何可以使用CASE的地方使用这些功能 – Multisync 2014-12-04 10:27:02

+0

不错,你为我打开了一个全新的世界:-) – OC2PS 2014-12-04 10:28:36

2
SELECT * FROM reviews WHERE product_id = 723 AND language_id = 4 

UNION 
SELECT * FROM reviews WHERE product_id = 723 AND language_id != 4 ORDER BY language_id ASC; 

说明:

您的需求是非常简单的。

你有两个SQL,你想要一个组合输出。

由于表格也是一样的,所以使用MySQL UNION