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 【问题描述】:我有两张桌子:phone 和 session_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 - 如果不在另一个表中,则从一个表中选择,否则从另一个表中选择的主要内容,如果未能解决你的问题,请参考以下文章