MySQL 检查两列的值,但具有首选列结果

Posted

技术标签:

【中文标题】MySQL 检查两列的值,但具有首选列结果【英文标题】:MySQL check two columns for value but with a preferred column result 【发布时间】:2019-11-17 15:20:57 【问题描述】:

我有一个 MariaDB SQL 表,有两个不同的 ID 行。

ID 是从以前的数据库版本导入的(old_id 引用来自另一个表),作为过渡措施需要进行搜索才能找到 ID,偏好较旧的 id 值。只能返回 ONE 行。

表:

new_id(PK)  |  old_id  |   data   |   more_data 
---------------------------------------------
   1        |    34    |   harge  |     spalt
   2        |     7    |   greet  |    sausages
   4        |   852    |  humbug  |    gertrude
   6        |    13    |  bloody  |   festivalz
   7        |   412    |   hello  |   fiddlests
   8        |     3    |  fraggo  |  piddlebiscs

new_id 是主键。

所以:

当页面加载ID=852时需要返回第4行 当页面加载ID=7时需要返回第2行 当使用ID=8 加载页面时,它返回第 8 行(因为 old_id 列中不存在 8) 当使用ID=5 调用页面时,它不返回任何内容(任何一列中都不匹配)

我尝试了什么:

我尝试了各种限定的方法,但找不到正确的语法:

(第一次尝试是愚蠢的)

尝试:

WHERE 
    table.old_id = :id 
    OR (table.new_id = :id AND table.old_id != :id) #bad one. 


WHERE 
    table.old_id = :id 
    OR (table.new_id = :id AND :id NOT IN (SELECT old_id FROM table)) 

WHERE 
    table.old_id = :id 
    OR (table.new_id = :id AND table.new_id NOT IN (SELECT old_id FROM table)) 
-- I think equivalent to the above 

WHERE CASE WHEN table.old_id = :id THEN true ELSE table.new_id = :id END

WHERE IF(table.old_id = :id, true, table.new_id = :id) 
-- I think equivalent to the above 

我的问题:

当找到 ID 时,SQL 仅在 new_id 中找到它时返回一行,否则每次都返回两行,当它应该在成功找到 old_id 后停止时。

我错过了什么;我怎样才能让 SQL 检查 old_id 列,只有在没有找到的情况下,然后检查 new_id 列并且只返回一个结果?

我检查过的内容

mysql get rows but prefer one column value over another 和 using CASE in the WHERE clause 以及其他各种不符合该概念的;有两个成功的匹配,但匹配应按列优先。

【问题讨论】:

【参考方案1】:

假设您的查询应该始终只返回一条记录(这就是我理解您的问题的方式),您可以进行条件排序和limit 1

select *
from mytable 
where :id in (old_id, new_id)
order by case when old_id = :id then 0 else 1 end
limit 1

如果两条记录匹配,则条件order by 子句将匹配old_id 的记录放在最前面。然后limit 1 消除了另一个匹配项。如果只有一条记录匹配,则排序无关紧要,并保留。

【讨论】:

感谢您提供的解决方案,该解决方案适用于初始测试。我对使用 LIMIT 犹豫不决,因为我相信它会否定索引,但查询似乎以不错的速度运行 欢迎@Martin!处理 1 或 2 条记录,不用担心limit 的性能...

以上是关于MySQL 检查两列的值,但具有首选列结果的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法“合并”两列,其中新列的值是具有特定值的原始列的名称,分组明智?

PostgreSQL 查询帮助:如何检查多个列的值是不是同时增加/减少

循环遍历熊猫表,按条件更改其他列的值

MYSQL GROUP BY 具有特定列的值对

如何确保两行不具有相同的值[重复]

熊猫,对于每一行获取两列之间最大列的值