在一个查询中选择具有多个条件的地方

时间:2019-02-27 18:42:20

标签: mysql join select union where

我想实现两项

这是我的数据库表,称为“表”。

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行。因此,我们在idfriend列中搜索3然后选择它。

我想将所有这些组合到一个MySQL SELECT查询中。我该怎么办?

任何帮助将不胜感激!

1 个答案:

答案 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