我有一个包含这些列的表:
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_id
和is_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
的行
1条答案
按热度按时间mwngjboj1#
一种解决方案是使用row_number()首先选择所有符合fk条件的记录,然后从选择中取出每组中的第一个。我们按
fk_id
分区并按is_main desc
排序,因此如果组中有一条is_main
记录,它将被选为组中的第一条记录,否则您将获得另一条is_main
为false的记录。SQL是为SQL Server编写的-根据需要为MySQL等进行调整。
结果如下:
| fk_id|姓名|
| - -----|- -----|
| 1|名字|
| 2|第二名|
| 3| 4th_name|
| 4| 5th_name|