mysql - 从 CASE 中的不同行返回值

标签 mysql

我不知道是否可能,但我想我可以问

我有一张包含家庭和子家庭的表格(family_table):

family_id  family_name     parent_id
1          Family 1        null
2          Family 2        null
3          Subfamily 1.1   1   
4          Subfamily 1.2   1
5          Family 3        null
6          Subfamily 2.1   2 

然后我有一个复杂的 SELECT,它返回一些 family_id,例如 2、4。

那么我需要返回以下信息:

principal_id  family_name     subfamily_id   subfamily_name
2             Family 2        null           null
1             Family 1        4              Subfamily 1.2

编辑:只要结果足够清晰,我不介意更改结果的显示方式或更改其他内容。

这是我到目前为止所做的:

SELECT
    CASE
WHEN ft.parent_id IS NULL THEN
    ft.family_id
ELSE
    ft.parent_id
END AS principal_id, 
/*I was thinking something like this, but I don't know how to select another row value here, or if there would be another way
CASE
WHEN ft.parent_id IS NULL THEN
    ft.family_name
ELSE
    *Family name from the parent*
END AS family_name*/
FROM
    family_table ft
LEFT JOIN family_table ft2 ON ft2.parent_id = ft.family_id
WHERE
    ft.family_id IN (2,4/*complicated select*/)

编辑:下面的尝试不起作用,因为它会将子系列的结果作为家庭返回,并且它不会加入我需要的子系列的父 ID。

或者可能是这样的:

SELECT
    ft.family_id as principal_id,
    ft.family_name as family_name,
    ft2.family_id as subfamily_id,
    ft2.family_name as subfamily_name
FROM ft.family_table
LEFT JOIN ft2.family_table ON ft2.parent_id = ft.family_id
WHERE
    /*ft.family_id OR ft2.parent_id*/ IN (2,4/*complicated select*/)

我不想通过执行 ft.family_id IN (2,4/*complicated select*/) OR cf2.parent_id IN (2,4/*complicated select*/)< 来重复这个可怕的选择。 我感觉我把一切都过于复杂化了......


这是最终的查询,考虑已接受的答案(以防有人想知道)

SELECT
    COALESCE (ft2.family_id, ft.family_id) AS family_id,
    COALESCE (ft2.family_name, ft.family_name) AS family_name,
    CASE WHEN ft.parent_id IS NOT NULL THEN ft.family_id
    END AS subfamily_id,
    CASE WHEN ft.parent_id IS NOT NULL THEN ft.family_name
    END AS subfamily_name
FROM family_table ft
JOIN (/* complicated select */) AS t ON t.family_id IN (ft.family_id, ft.parent_id)
LEFT JOIN family_table ft2 ON ft2.family_id = ft.parent_id

最佳答案

尝试加入“复杂选择”而不是使用 IN() ,如下所示:

SELECT
.....
FROM
    family_table ft
LEFT JOIN family_table ft2 ON ft2.parent_id = ft.family_id
JOIN ( /* complicated select here */ ) t
 ON(t.ID_OR_WHATEVER IN(ft.family_id,cf2.parent_id))

这将具有相同的效果。

关于mysql - 从 CASE 中的不同行返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38371918/

相关文章:

php - 如何从数据库中的 PHP 序列化数组获取价格数据

php - 单击以使用 jquery 将动态行添加到现有记录

javascript - 第一行完成后如何开始下一行?

MySQL序列创建

mysql - 从 MySQL 中的非 AUTO_INCREMENT 列获取最后插入的 ID

php - 向数据库插入不需要的数据

php - mysql时间和php时间不一样

MySQL - 高性能查询帮助

mysql - SQL Select - 复杂查询中的日期比较

PHP 基本搜索引擎