我想要实现两件事。
这是我的数据库表“table”。
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
这应该选择row 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 AND IS NOT NULL,则使用friend
数字和:
SELECT * WHERE id = friend from previous table.
在这个例子中,它将返回第3,4,5行,因为ID = 5而friend
ID为5所以我们搜索列id
和friend
为3并且我们选择它。
我想将所有这些组合在一起成为一个MySQL SELECT查询。我怎样才能做到这一点?
任何帮助将不胜感激!
在第一个场景中,我不明白为什么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。如果friend字段为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