【问题标题】:UNION three different SELECTs in MYSQL在 MYSQL 中联合三个不同的 SELECT
【发布时间】:2015-01-29 09:41:14
【问题描述】:

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

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

  • 只能显示前 20 个结果

  • 第一个 SELECT 条件是 firstname+lastname+birthdate 的组合:WHERE (birthdate="1980-01-01") AND ((firstname LIKE "%john%") AND (lastname LIKE "%smith %"))

  • 第二个 SELECT 条件是 firstname+lastname 的组合:WHERE (firstname LIKE "%john%") AND (lastname LIKE "%smith%")

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

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

  • 导出的 id 必须是唯一的:如果相同的 id 来自所有 3 个 SELECT(或来自多个 SELECT),那么它必须在输出表中只出现一次

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

  • 如果多个SELECT产生相同的id值,那么它的行必须有最高的顺序值;其中最高阶可能为 1,从第一个 SELECT

  • 1234563如果 id 来自第二个 SELECT,则它的类型值为“~firstname+lastname~”;最后,如果 id 来自第三个 SELECT,则它的类型值为“~phone~”
  • 如果相同的 id 值来自多个 SELECT,则“type”别名列上的值必须是找到该 id 的 SELECT 之间的串联(例如,如果相同的 id 导致所有3 SELECT 查询然后“类型”列上的值将是“~firstname+lastname+birthdate~~firstname+lastname~~phone~”)

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

【问题讨论】:

  • 请尽你最大的努力:SQL 表结构 + SQL 查询。

标签: mysql select union


【解决方案1】:

这里有一些使用 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

【讨论】:

    【解决方案2】:

    最后我做了这样的事情,效果很好:

    SELECT MIN(`ord`) AS `order` , `id` , GROUP_CONCAT(`spec`) as `type` FROM (
    SELECT "1" AS `ord` , `id` , "~firstname+lastname+birthdate~" AS `spec` FROM `people` WHERE (`birthdate` = "1986-04-02") AND (`lastname` LIKE "%smith%") AND (`firstname` LIKE "%john%")
    UNION
    SELECT "2" AS `ord` , `id` , "~firstname+lastname~" AS `spec` FROM `people` WHERE (`lastname` LIKE "%smith%") AND (`firstname` LIKE "%john%")
    UNION
    SELECT "3" AS `ord` , `id` , "~phone~" AS `spec` FROM `people` WHERE (`phone`="0123456")
    ) final
    GROUP BY final.`id`
    ORDER BY `order` ASC 
    LIMIT 20

    感谢 mlinth 提供的替代方案...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多