【问题标题】:Selecting from different tables based on condition根据条件从不同的表中选择
【发布时间】:2026-02-14 03:25:03
【问题描述】:

我有一张桌子comments ->

id | comment | type | userid | 
1    Hello     human    9
2    Hi        robot    4
3    Gnaw!     animal   1
4    Boo       ghost    2

我还有四个表 human,robot,ghostanimal 这些表包含一些关于它们自身的基本细节...

现在我知道评论的价值说:$id = 3 如果我这样做了

 $data = mysqli_query($con,"SELECT  type FROM comments WHERE id = $id");
 while($row  = mysqli_fetch_assoc($data)){
        $table = $row['type'];          
        $table_data = mysqli_fetch_assoc(mysqli_query($con,"SELECT * FROM $table"));
 }

这将为我获取有关评论者的所有数据,但事实证明这太慢了....有什么办法可以将其组合到 一个查询中?

【问题讨论】:

    标签: mysql sql select if-statement


    【解决方案1】:

    一种方法是使用左连接。

    SELECT c.type, COALESCE(h.detail,r.detail,a.detail,g.detail)
    FROM comments
    LEFT JOIN human h ON c.type = 'human' AND c.id = h.id
    LEFT JOIN robot r ON c.type = 'robot' AND c.id = r.id
    LEFT JOIN animal a ON c.type = 'animal' AND c.id = a.id
    LEFT JOIN ghost g ON c.type = 'ghost' AND c.id = g.id
    

    另一种方法是在四个表上进行 UNION,然后加入它们:

    SELECT c.type, q1.detail
    FROM comments c
    LEFT JOIN 
    (
      SELECT 'human' AS type, detail FROM human
      UNION
      SELECT 'robot', detail FROM robot
      (etc.)
    ) q1 ON c.type = q1.type AND q1.id = c.id
    

    我更喜欢第二个选项,因为这个选项可以更轻松地加入许多详细信息列。我认为性能方面没有太大差异。

    【讨论】:

    • COALESCE 返回第一个非空值,通过 left JOIN 你“获取”所有但你只显示非空,聪明的解决方案:)
    • 哪个更好?
    • @popovitsj MySQL 无法实现第二种解决方案,MySQL 不支持 CTE
    • @RoshanShaw 你能链接到一个显示它不起作用的小提琴吗?
    • 我们将不得不忍受它;-)。然而,不管有没有 CTE,它仍然是由 EAV 反模型引起的丑陋解决方案
    最近更新 更多