我想实现两项。
这是我的数据库表,称为“表”。
id | friend
---|--------
1 | null
2 | 1
3 | 0
4 | 3
5 | 3
6 | null
我要执行两个SELECT查询。
$id = 3;
SELECT * FROM table WHERE id = $id; // Not sql injection safe, just an example
这应选择行id =3。如果该行的friend
列= 0,则:
SELECT rows WHERE friend = $id.
如果该行的friend
列不是0,则返回该行,即第3行。但是,因为我的上表显示该行ID为3的friend
列= 0,则应该总共返回行:3、4、5。
另外,另一种情况有些不同:
$id = 5;
SELECT * FROM table WHERE id = $id;
如果该行的friend
列<>(不等于)0并且不为空,则使用friend
数字和:
SELECT * WHERE id = friend from previous table.
在此示例中,由于ID = 5且friend
ID的5为3,它将返回第3、4、5行。因此,我们在id
和friend
列中搜索3然后选择它。
我想将所有这些组合到一个MySQL SELECT查询中。我该怎么办?
任何帮助将不胜感激!
答案 0 :(得分:2)
在第一种情况下,我不完全理解为什么friend
的零值返回3、4和5。为什么不是2?我假设如果friend
的值为零,则添加将您作为朋友的行。
因此,在第一个示例之前,我无法站立名为“ table
”的表,因此我将使用friends
作为表的名称。
SELECT FF.id
FROM friends FF
INNER JOIN friends FID on FF.friend = FID.id
WHERE FID.friend = 0 AND FID = $id
UNION
SELECT F2.id FROM friends F2 WHERE F2.id = $id AND F2.friend IS NOT NULL
内部联接获取朋友的ID(FID.id
),然后再次联接在friends表上,以获取所有记录作为朋友(FF.friend
)值。
然后UNION
将包含原始ID。如果朋友字段为NULL,则UNION
的两面都不会返回任何结果。
类似地,对于第二种情况,使用给定值($id
= 5),找到该记录的friend
值,并以该记录为好友查询所有记录,然后合并其记录。
SELECT FF.id
FROM friends FF
WHERE FF.friend = (SELECT FIN.friend FROM friends FIN where FIN.id = $id)
UNION
SELECT FIN.friend FROM friends FIN where FIN.id = $id