Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 基于多个或';d谓词_Mysql_Sql - Fatal编程技术网

Mysql 基于多个或';d谓词

Mysql 基于多个或';d谓词,mysql,sql,Mysql,Sql,在这种情况下,我需要根据一组具有优先顺序的条件从表中获取X个记录。换言之: 尝试使用条件1从表中获取X个记录 如果不满足X的配额,请尝试使用条件2从表中获取其他记录 如果仍不满足X的配额,请尝试使用条件3从表中获取其他记录 一个具体的例子: +----+-----------------+-------------------+-------------+ | id | primary_user_id | secondary_user_id | loca

在这种情况下,我需要根据一组具有优先顺序的条件从表中获取X个记录。换言之:

  • 尝试使用条件1从表中获取X个记录
  • 如果不满足X的配额,请尝试使用条件2从表中获取其他记录
  • 如果仍不满足X的配额,请尝试使用条件3从表中获取其他记录
  • 一个具体的例子:

    +----+-----------------+-------------------+-------------+                     
    | 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
    根据我的理解,简单的OR子句不能保证返回的记录的顺序与获取记录的条件相同:

    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