2016-07-13 97 views
1

我想为我的用户返回一个朋友列表,并试图收集与其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' 
") 

如何写这个查询语句?

+0

为什么你有PHP标签? –

+0

因为我在php中查询这个,我应该把它关掉吗? – toastext

+0

我想这个问题只关于SQL,所以你可以删除PHP标签 –

回答

1

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

如果你真的想使用情况下,你可以这样做:

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 
+0

你说的“如果”你指的是CASE语法。有没有更好的方法你会建议?因为CASE语法是我认为mysql可以执行“if”语句的唯一方式。顺便谢谢,我会试试这个。 :) – toastext

+0

更新了我的答案。这是工会。 – e4c5

+0

嘿,你看过我的想法了。打算在“union”语法中进行一些研究。 – toastext

相关问题