mysql - 如果不在另一个表中,则从一个表中选择,否则从另一个表中选择

Posted

技术标签:

【中文标题】mysql - 如果不在另一个表中,则从一个表中选择,否则从另一个表中选择【英文标题】:mysql - select from one table if not in the other , else select from the other one 【发布时间】:2015-02-14 12:15:21 【问题描述】:

我有两张桌子:phonesession_phone。这两个表都有名为 phone_number 的列。

现在我想检查表 session_phone 中是否存在电话号码,如果不存在则从表 phone 中选择一个随机电话号码。但是如果电话号码存在,它应该从表 session_phone 中选择电话号码。

以下是我的查询,它似乎不起作用。

    select case when b.phone_number is null then a.phone_number else b.phone_number end 'phone_number'
from phone a left join session_phone b on 
a.phone_number = b.phone_number and a.user_group = b.user_group 
order by rand() limit 1

上述查询的问题在于,即使电话号码存在于 session_phone 中,它也会为我提供表 phone 中的其他号码。

请指教。谢谢。

样本数据:

电话表中,电话号码为:1111,2222,3333,4444session_phone表中,电话号码为:2222

输出应该是(因为我按 rand() 和限制 1 排序):2222

【问题讨论】:

可以添加示例数据和预期结果吗? 我认为你应该将from phone a left join session_phone b 改为反之亦然 @Jens - 我已经添加了示例数据和输出。谢谢。 "现在我想检查电话号码是否存在.." - 哪个电话号码?编写返回 2222 的查询很容易,但我认为您没有很好地指定确切的规则,并且不清楚当 session_phone 包含 0 或多于 1 行时,或者当 limit 时您想要什么行为被提升了。 ***.com/questions/28452562/…的可能重复 【参考方案1】:

完成这项工作的最简单的查询可能是:

select coalesce(s.phone_number, p.phone_number)
from (select * from phone order by rand() limit 1) p
left join session_phone s on s.phone_number = ?

见SQLFiddle

这通过从电话中获取 1 个随机行并将其左连接到 session_phone 中可能的命中来工作,如果没有命中,它将为空。 Coalesce 返回列表中的第一个非空值,因此,如果有命中,则得到它,如果没有命中,则得到随机值。

【讨论】:

以上是关于mysql - 如果不在另一个表中,则从一个表中选择,否则从另一个表中选择的主要内容,如果未能解决你的问题,请参考以下文章

如果存在则从表中选择,否则从oracle中的另一个表中选择

如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回

用于查找一个表中但不在另一个表中的行的 MySQL 查询

在另一个表中搜索整个单词的表,如果找到则从结果中排除

Mysql:从一个表中选择不在另一个表中的行

mysql更新一个表不在另一个表中的数据