我有一个名为 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/