根据值选择一行中的不同列

时间:2016-07-13 03:03:49

标签: mysql sql mysqli

我正在尝试为我的用户返回朋友列表,而我正在尝试收集与其user_id匹配的值。

| ID | user1_id | user1_status | user2_id | user2_status |
| 1  | 1        |  0           |  2       | 0            |
| 2  | 4        |  1           |  5       | 1            |
| 3  | 4        |  1           |  6       | 0            |
| 4  | 1        |  0           |  4       | 1            |

这是我遇到的问题,我要查找的值可以是“user1_id”/“user2_id”,然后我需要为其他用户返回“user_status”。 ñ。我让这张桌子非常简单。在我的版本中,我希望我的服务器有更多列,以避免返回。

假设客户端user_id为4,所以我需要选择user1_id / user2_id等于4的所有行,并返回另一个人user_status。在表中,第一个值等于4的情况是在user1_id中,我需要该行来返回user2_id和user2_status。

这是我到目前为止所做的,但它不起作用:

mysqli($connect, "
SELECT `id`
    CASE 
        WHEN `user1_id`='4' THEN `user2_id` AND `user2_status`
        WHEN `user2_id`='4' THEN `user1_id` AND `user1_status` 
    ELSE NULL
    END 
        from 'relationship' 
        where `user1_id`='4' OR `user2_id`='4'
")

如何编写此查询语句?

1 个答案:

答案 0 :(得分:1)

如果您参考CASE syntax,您会看到它被定义为返回单个列而不是元组。此外,在您的查询中,您尝试获取(user2_id,user_status)或NULL。在这里,你得到的列数不匹配,也是不允许的。

如果你真的想使用CASE,你可以这样做:

SELECT `id`
    CASE 
        WHEN `user1_id`='4' THEN `user2_id`, 
        ELSE NULL
    END
    CASE 
        WHEN `user2_id`='4' THEN `user1_id`
        ELSE NULL
    END
    CASE
        WHEN `user1_id`='4' THEN `user1_status`
        ELSE NULL
    END
    CASE
        WHEN `user2_id`='4' THEN `user2_status`
        ELSE NULL
    END

    FROM 'relationship' 
        where `user1_id`='4' OR `user2_id`='4'
是的,笨拙而令人困惑。如果你使用UNION会更简单。

SELECT id, user2_id AS uid, user2_status as ustatus FROM relationship WHERE user1_id = 4
UNION
SELECT id, user1_id AS uid, user1_status as ustatus FROM relationship WHERE user2_id = 4