【问题标题】:SELECT where with multiple conditions in ONE query在一个查询中选择具有多个条件的位置
【发布时间】:2019-07-21 14:04:12
【问题描述】:

我想要实现两件事

这是我的数据库表,名为“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 column = 0,那么:

SELECT rows WHERE friend = $id.

如果该行的 friend 列不是 0,则只返回该行,即第 3 行。但是因为我上面的表格显示第 3 行的 friend 列 = 0,这应该完全返回行:3、4、5。


另外,另一种情况有点不同:

$id = 5;
SELECT * FROM table WHERE id = $id;

如果该行的friend 列(不等于)0 且不为空,则使用friend 数字和:

SELECT * WHERE id = friend from previous table.

在本例中,它将返回第 3、4、5 行,因为 ID = 5 并且 friend ID 为 5 是 3。所以我们在列 id AND friend 中搜索 3 并选择它。

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

任何帮助将不胜感激!

【问题讨论】:

    标签: mysql join select union where


    【解决方案1】:

    在第一种情况下,我不明白为什么 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) 并再次加入朋友表以获取所有以朋友 (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
    

    【讨论】:

    • 这两者可以结合起来吗?
    • 我对此表示怀疑。我怀疑它的原因是您要求以一种方式与给定 id 相关的结果,然后还希望包含一条与该方式无关的记录。我认为 UNION 是将其放入服务器查询的唯一方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多