mysql 获取列中为true的记录,否则获取另一条记录

56lgkhnf  于 12个月前  发布在  Mysql
关注(0)|答案(1)|浏览(92)

我有一个包含这些列的表:

CREATE TABLE `my_table` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `fk_id` bigint(20) UNSIGNED NOT NULL,
  `is_main` tinyint(1) NOT NULL DEFAULT 0,
  `name` varchar(1000) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

对于这些行:
| id| fk_id| is_main|姓名|
| - -----|- -----|- -----|- -----|
| 第一章|第一章|我的天啊|名字|
|2|2| 第一章|second_name|
| 3| 3| 0|第三名|
| 四个人|三个人|第一章|4th_name|
| 五楼|四个人|第一章|5th_name|
我需要获取fk_idis_main = 1的行。但是,如果对于某个fk_id,没有is_main = 1的行,我需要为同一个fk_id获取另一行(也是随机的,无论如何):
现在我使用标准的where来获取is_main = 1的行:

SELECT fk_id, name FROM my_table WHERE is_main = 1 AND fk_id IN (1, 2, 3, 4)

在这个查询中,我没有得到fk_id = 1的任何行。
相反,我需要获取具有id = 1, 2, 4, 5的行

mwngjboj

mwngjboj1#

一种解决方案是使用row_number()首先选择所有符合fk条件的记录,然后从选择中取出每组中的第一个。我们按fk_id分区并按is_main desc排序,因此如果组中有一条is_main记录,它将被选为组中的第一条记录,否则您将获得另一条is_main为false的记录。
SQL是为SQL Server编写的-根据需要为MySQL等进行调整。

create table #temp (
    id int, fk_id int, is_main bit, [name] varchar(30))
insert into #temp (id, fk_id, is_main, [name])
values 
    (1,     1,  0,  'first_name'),
    (2,     2,  1,  'second_name'),
    (3,     3,  0,  'third_name'),
    (4,     3,  1,  '4th_name'),
    (5,     4,  1,  '5th_name')

select T.fk_id, T.[name]
from 
(
select 
    fk_id,
    [name],
    is_main,
    row_number() over (partition by fk_id order by is_main desc) as seq
from #Temp
where 
    fk_id in (1, 2, 3, 4)
) T
where t.seq = 1;

结果如下:
| fk_id|姓名|
| - -----|- -----|
| 1|名字|
| 2|第二名|
| 3| 4th_name|
| 4| 5th_name|

相关问题