MYSQL-返回查询A或查询B,但不能同时返回两者.如果两者都存在,则返回查询A的结果


SELECT phone_number
, 3
, 3
, toppings
, crust
FROM pizza p
INNER JOIN lemon l ON p.seven_digit = l.code
UNION
SELECT phone_number
, 3
, 3
, toppings
, crust
FROM pizza p
INNER JOIN lemon l ON p.six_digit = l.code;

正如你所看到的:查询A INNER JOIN子表UNION查询B INNER JOIN子表

我想要查询A或查询B的结果,但不是两者都要。如果两者都存在,则返回A的结果。

本例中的l.code有6或7位数字。

现在我的成绩是原来的两倍。

更新

所以我会帮助做一个更好的描述:

CREATE TABLE not_on_lrn_table_3_22 (
phone_number bigint NOT NULL,
seven_digit int DEFAULT NULL,
six_digit int DEFAULT NULL,
PRIMARY KEY (phone_number)
)
CREATE TABLE lerg (
code int NOT NULL,
status varchar(3) DEFAULT NULL
)
INSERT INTO not_on_lrn_table_3_22
VALUES
(2222226433, 2222226, 222222),
(2222222222, 2222222, 222222),
(2222263445, 2222263, 222226),
(2222283445, 2222283, 222228);
INSERT INTO lerg
VALUES
(222222, 'AAA'), (2222226, 'BBB'), (2222223, 'CCC'), (2222281, 'DDD'),
(2222263, 'EEE')

在此处输入图像描述

我希望not_on_lrn_table_3_22中的每一行都有一个结果(如果匹配的话(。

例如,Lerg代码列的长度为6/7位。我想查看not_on_lrn_table_3_22的第一行,查找它的七位数值,并尝试在lerg.code上匹配。如果它在那里,则返回该行数据,如果它不在那里,请对照lerg.code[/em>检查六位数列。

这个想法是7位数的代码匹配更准确。

提供给我的解决方案是:

WITH cte1 AS (
SELECT pn.*, l.*
, ROW_NUMBER() OVER (PARTITION BY pn.phone_number
ORDER BY CASE WHEN l.code = pn.seven_digit
THEN 1 ELSE 2 END) AS ord
FROM not_on_lrn_table_3_22 AS pn
JOIN lerg AS l
ON l.code IN (pn.six_digit, pn.seven_digit)
)
SELECT * FROM cte1
WHERE ord = 1
;

它有效,但需要很长时间才能完成。

这是另一张图片,解释了我正在努力实现的目标。在此处输入图像描述

看第一行:第6/7列(六位数(中的代码/状态匹配,因此我将返回与lerg表相关的数据,其中代码=222222。

第2行:有2场比赛。4/5/6/7列中的代码/状态。(七位数和六位数(。当两者匹配时,返回与lerg的表相关联的数据,其中代码为2222226。(因为它有更多的数字,因此更准确(。

第3行:4/5列中有1个匹配项。同样,因为这是7位数字,所以你只需在第二行做同样的操作。

第4行:没有匹配项,因此不应返回任何内容。

不确定这会有多大的改进,但试试

select phone_number, coalesce(seven_digit,six_digit), coalesce(l2.status,l.status)
from not_on_lrn_table_3_22 as pn
left join lerg as l on l.code =pn.six_digit
left join lerg as l2 on l2.code=pn.seven_digit
where coalesce(l2.status,l.status) is not null;

假设phone_number来自表lemon(虽然您没有指定哪一列属于lemon,但我假设SELECT子句中至少有一列来自lemon,否则UNION将合并相同的行,您不会得到任何重复(:

SELECT 
phone_number, 
3, 
3, 
toppings, 
crust 
FROM
(
SELECT 
if(l1.phone_number is null, l2.phone_number, l1.phone_number) as phone_number
, toppings
, crust
FROM pizza p
LEFT JOIN lemon l1 ON p.seven_digit = l1.code
LEFT JOIN lemon l2 ON p.six_digit = l2.code
)
t
WHERE phone_number is not null;
SELECT phone_number
, 3 some_alias
, 3 another_alias
, toppings
, crust
FROM pizza p
INNER JOIN lemon l ON p.seven_digit = l.code
WHERE LENGTH(l.code) = 7
UNION ALL
SELECT phone_number
, 3
, 3
, toppings
, crust
FROM pizza p
INNER JOIN lemon l ON p.six_digit = l.code
WHERE LENGTH(l.code) = 6
AND NOT EXISTS (SELECT NULL
FROM pizza p
INNER JOIN lemon l ON p.seven_digit = l.code
WHERE LENGTH(l.code) = 7)

如果要最大限度地减少服务器执行的工作量,请创建并使用存储过程,而不是单个查询。

最新更新