Mysql 基于多个或';d谓词
在这种情况下,我需要根据一组具有优先顺序的条件从表中获取X个记录。换言之:Mysql 基于多个或';d谓词,mysql,sql,Mysql,Sql,在这种情况下,我需要根据一组具有优先顺序的条件从表中获取X个记录。换言之: 尝试使用条件1从表中获取X个记录 如果不满足X的配额,请尝试使用条件2从表中获取其他记录 如果仍不满足X的配额,请尝试使用条件3从表中获取其他记录 一个具体的例子: +----+-----------------+-------------------+-------------+ | id | primary_user_id | secondary_user_id | loca
+----+-----------------+-------------------+-------------+
| id | primary_user_id | secondary_user_id | location_id |
+----+-----------------+-------------------+-------------+
| 1 | user1 | user1 | MI |
| 2 | user1 | user2 | NV |
| 3 | user2 | user1 | MI |
| 4 | user1 | user3 | MI |
| 5 | user4 | user5 | NV |
+----+-----------------+-------------------+-------------+
- 标准1:
secondary\u user\u id=@user
- 标准2:
primary\u user\u id=@user
- 标准3:
location\u id=@location
SELECT * FROM Foo WHERE
secondary_user_id = 'user1' OR
primary_user_id = 'user1' OR
location_id = 'NV'
LIMIT 2
工会似乎是更好的选择:
SELECT * FROM Foo WHERE secondary_user_id = 'user1'
UNION
SELECT * From Foo WHERE primary_user_id = 'user1'
UNION
SELECT * FROM Foo WHERE location_id = 'NV'
有限制:
SELECT * FROM (
SELECT * FROM Foo WHERE secondary_user_id = 'user1'
UNION
SELECT * From Foo WHERE primary_user_id = 'user1'
UNION
SELECT * FROM Foo WHERE location_id = 'NV'
) AS r LIMIT 2
如果我想确保结果的顺序与获取条件相同,那么UNION是唯一的选项吗?我知道这可以在我的应用程序中以编程方式完成,但如果可能的话,我希望将尽可能多的工作转移到数据库(MySQL,如果这很重要)。您的上一个查询看起来是该任务的最佳工作解决方案,因为您希望将其保留在MySQL中 唯一的问题是,
UNION
子句可能不止一次地为您提供一些行。例如,如果一行具有secondary\u user\u id='user1'
和primary\u user\u id='user1'
,则将返回两次
要避免这种情况,请使用DISTINCT
:
SELECT DISTINCT * FROM (
SELECT * FROM Foo WHERE secondary_user_id = 'user1'
UNION
SELECT * From Foo WHERE primary_user_id = 'user1'
UNION
SELECT * FROM Foo WHERE location_id = 'NV'
) AS r LIMIT 2
已编辑
@扎伊努拉巴丁钦说的绝对正确
联合
如果两个查询返回相同的名称,则自动使不同
因此,问题的最后一个查询在没有任何更改的情况下运行良好 您也可以简单地使用ORs,然后使用CASE添加订单:
SELECT *
FROM Foo
WHERE secondary_user_id = 'user1'
OR primary_user_id = 'user1'
OR location_id = 'NV'
ORDER BY (CASE
WHEN secondary_user_id = 'user1' THEN 0
ELSE 100
END) +
(CASE
WHEN primary_user_id = 'user1' THEN 0
ELSE 10
END) +
(CASE
WHEN location_id = 'NV' THEN 0
ELSE 1
END);
它效率很高,但可读性稍差。只需使用
orderby
:
SELECT *
FROM Foo
WHERE secondary_user_id = 'user1' OR
primary_user_id = 'user1' OR
location_id = 'NV'
ORDER BY (CASE WHEN secondary_user_id = 'user1' THEN 1
WHEN primary_user_id = 'user1' THEN 2
ELSE 3
END)
LIMIT 2;
不要,我重复一遍,不要,假设
UNION
或UNION ALL
将按特定顺序生成结果。保证排序的唯一方法是使用显式的ORDER BY子句。如果两个查询返回相同的名称,union会自动区分@IIdar@ZaynulAbadinTuhin哦,是的,你完全正确!谢谢那么为什么需要distinct?@Zaynulabadinuthin我正在编辑我的答案)似乎问题的最后一个查询可以正常工作,没有任何更改。您可以在每个查询中使用order by