mysql - 在 MYSQL 中 UNION 三个不同的 SELECT

标签 mysql select union

我有一个名为 people 的 MYSQL 表,其列为:id|firstname|lastname|birthdate|phone。

我对 MYSQL 很陌生,我正在尝试 UNION 多个 SELECT,以便结果如下所示:

  • 仅必须显示前 20 个结果

  • 第一个 SELECT 条件是名字+姓氏+出生日期的组合:WHERE (birthdate="1980-01-01") AND ((firstname LIKE "%john%") AND (lastname LIKE "%smith %"))

  • 第二个选择条件是名字+姓氏的组合:WHERE (firstname LIKE "%john%") AND (lastname LIKE "%smith%")

  • 第三个选择条件是通过电话:WHERE phone="0123456"

  • 输出结果实际上必须有3列:order|id|type;其中“order”和“type”是别名列

  • 导出的 id 必须是唯一的:如果所有 3 个 SELECT(或多个 SELECT)产生相同的 id,则它必须在输出表中仅出现一次

  • “order”列对于第一个 SELECT 的结果必须具有值 1,对于第二个 SELECT 的结果必须具有值 2,对于最后一个 SELECT 的结果必须具有 3

  • 如果多个 SELECT 产生相同的 id 值,则其行必须具有最高的顺序值;从第一个 SELECT 开始,可能的最高阶数为 1

  • 别名列“type”必须像这样工作:如果 id 来自第一个 SELECT,则其类型值为“~firstname+lastname+birthdate~”;如果第二个 SELECT 结果为 id,则其类型值为“~firstname+lastname~”;最后,如果第三个 SELECT 结果为 id,则其类型值为“~phone~”

  • 如果多个 SELECT 产生相同的 id 值,则“type”别名列上的值必须是找到该 id 的 SELECT 之间的串联(例如,如果相同的 id 导致所有3 个 SELECT 查询,则“type”列上的值将为“~firstname+lastname+birthdate~~firstname+lastname~~phone~”)

有可能实现这样的输出吗?

最佳答案

这是使用 CASE 语句的内容。我认为由于您的订单类型声明,您会陷入联合声明的困惑之中。希望我已经明白你在做什么 - 如果你发布示例数据会更容易!不管怎样,即使这并不完全符合你的要求,你也明白了......

[编辑]我不认为你需要独特的,但我也不认为它有什么伤害......

 SELECT DISTINCT 
        CASE WHEN birthdate='1980-01-01' 
                AND firstname LIKE '%john%' AND lastname LIKE '%smith%'
             THEN 1
             WHEN firstname LIKE '%john%' AND lastname LIKE '%smith%'
             THEN 2
             WHEN phone='0123456'
             THEN 3
        END AS outputorder, -- avoid confusion of using an SQL keyword as a column name,
           id,

           CONCAT(
              CASE 

     WHEN birthdate='1980-01-01' 
            AND firstname LIKE '%john%' AND lastname LIKE '%smith%'
            THEN CONCAT('~',firstname,'+',lastname,'+','~')
          END ,

         CASE WHEN firstname LIKE '%john%' AND lastname LIKE '%smith%'
             THEN CONCAT('~',firstname,'+',lastname,'~')
         END ,
         CASE WHEN phone='0123456'
              THEN CONCAT('~',phone,'~')
         END 
       ) -- end the concat
       AS outputtype
FROM

     mytable
WHERE
   ( birthdate='1980-01-01' 
   AND firstname LIKE '%john%' AND lastname LIKE '%smith%')
OR
   (firstname LIKE '%john%' AND lastname LIKE '%smith%')
OR
    phone='0123456'
ORDER by 1,2 LIMIT 20

关于mysql - 在 MYSQL 中 UNION 三个不同的 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27227464/

相关文章:

php - 双空值联合php

mysql - Mysql 中使用 count、group by、order by 和 union 进行选择失败

php - 使用 php 错误检查连接到 mySQL 数据库

php - 如何在每个结果后添加 <br/> 而不是最后一个结果?

R 根据 CSV 中的条件选择工作目录中的文件

asp.net - 单击以选择 GridView 中的行,导致编辑模式下回发

MySQL 加入子类别

python - 在 Celery 任务中保存对象后,Django 匹配查询不存在

Mysql 在值更改时更新行

MySQL 查询错误计数