【问题标题】:SQL query with multiple unrelated tables具有多个不相关表的 SQL 查询
【发布时间】:2016-12-19 10:14:45
【问题描述】:

在我的 mySQL 数据库中有四个表:breakfastdinnersuppersupper。 这些表的列名相同。其中每个人都有一个名为“accepted”的列,等于01

我想做一个 SQL 查询,从这四个表中给我一个随机行 WHERE 'accepted' 列等于 0。

只有 1 个有效的表的 SQL 查询:

SELECT * FROM breakfast WHERE accepted=0 ORDER BY RAND() LIMIT 1

我的 SQL 查询版本有四个不起作用的表:

 SELECT * FROM breakfast, dinner, supper, dessert WHEREbreakfast.accepted=0
AND dinner.accepted=0 AND supper.accepted=0 AND dessert.accepted=0 ORDER BY RAND() LIMIT 1

【问题讨论】:

  • 表格是否有相同的列?
  • 决定你使用什么 RDBMS。
  • 请指定每个表中的列,当我们使用联合时,您必须为不同查询中的字段使用相同的名称,因为我们需要字段名称来提供别名

标签: mysql select multiple-tables multiple-conditions


【解决方案1】:

这样试试,

我假设您在所有四个表中的列数都相同。

MySQL

   SELECT col1,col2
FROM (
    SELECT col1,col2
    FROM breakfast
    WHERE breakfast.accepted = 0

    UNION

    SELECT col1,col2
    FROM dinner
    WHERE dinner.accepted = 0

    UNION

    SELECT col1,col2
    FROM supper
    WHERE supper.accepted = 0

    UNION

    SELECT col1,col2
    FROM dessert
    WHERE dessert.accepted = 0
    ) T
ORDER BY RAND() LIMIT 1

SQL 服务器:

SELECT top 1 col1,col2
FROM (
    SELECT col1,col2
    FROM breakfast
    WHERE breakfast.accepted = 0

    UNION

    SELECT col1,col2
    FROM dinner
    WHERE dinner.accepted = 0

    UNION

    SELECT col1,col2
    FROM supper
    WHERE supper.accepted = 0

    UNION

    SELECT col1,col2
    FROM dessert
    WHERE dessert.accepted = 0
    ) T
ORDER BY newid()

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT breakfast FROM 
    (SELECT breakfast FROM breakfast WHERE accepted=0 
    union
    SELECT supper as breakfast FROM supper WHERE accepted=0 
    union
    SELECT dessert as breakfast FROM dessert WHERE accepted=0 
    union
    SELECT dinner as breakfast FROM dinner WHERE accepted=0 
    ) food ORDER BY RAND() LIMIT 1 
    

    在这个查询中,除了早餐表中有一个名称为早餐的字段,如果您需要使用“*”,请使用别名使所有字段名称在不同的联合查询中相似。

    【讨论】:

      【解决方案3】:

      检查一下

       SELECT TOP 1 * FROM breakfast,
       (SELECT TOP 1 * FROM dinner WHERE accepted=0 ORDER BY RAND()) As Dinner,
       (SELECT TOP 1 * FROM supper WHERE accepted=0 ORDER BY RAND()) As supper,
       (SELECT TOP 1 * FROM dessert WHERE accepted=0 ORDER BY RAND()) As dessert 
       WHERE breakfast.accepted=0 ORDER BY RAND()  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-01
        • 2011-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多