MYSQL SQL语句。这个条件查询是否可行?

3

我在想这种查询是否可能。如果可能,希望能得到帮助。

    SELECT 

        field1,
        field2,
        field3

    FROM maintable

    WHERE maintable.field1 = passed_in_parameter


    IF (maintable.field2 = 1) THEN
            //do anything like joins
        INNER JOIN widgettable on widgettable.widgetid = field3

    ELSEIF (maintable.field2 = 2) THEN
            //do anything like joins
        INNER JOIN gizmottable on gizmottable.gizmoid = field3

    END IF

我希望我的需求是有意义的。简而言之,我需要根据原始选择中的字段值,连接不同的表。


你可以使用 LEFT JOIN 将它们连接起来。 - zerkms
不,这不是有效的SQL语法。 - Marc B
你想从widgettable或gizmotable中选择任何内容吗? - Chetter Hummin
@Amit Bhargav - 我需要 widgettable.widget_name 或 gizmotable.gizmo_name。 - gbroke
我认为你可以使用以下代码:INNER JOIN widgettable on widgettable.widgetid = field3 AND maintable.field2 = 1 INNER JOIN gizmottable on gizmottable.gizmoid = field3 AND maintable.field2 = 2 - Salman A
@gbroke 好的。我已经更新了我的答案,包括这个内容。 - Chetter Hummin
3个回答

4

正如zerkms所建议的那样,您可以使用左外连接将它们两个连接起来。请查看以下内容是否有效:

select mt.field1,
    mt.field2,
    mt.field3,
    CASE mt.field2 WHEN 1 THEN wt.widgetname WHEN 2 THEN gt.gizmoname END AS name 
from maintable mt
  left join widgettable wt
    on wt.widgetid = mt.field3
  left join gizmotable gt
    on gt.gizmoid = mt.field3
where mt.field1 = 'param'
   and ((mt.field2 = 1 and wt.widgetid is not null)
       or (mt.field2 = 2 and gt.gizmoid is not null))

只是好奇,为什么在MySQL中要添加OUTER - zerkms
@zerkms 哦,我的错...我平常不用mysql。忘记了outer可以省略。谢谢! - Chetter Hummin
不行,MySQL 会忽略它。所以你需要使用另一个与之不同的数据库。这就是我问的 :-) - zerkms
@zerms 是的,我通常使用Oracle。 - Chetter Hummin
@Amit Bhargava 我正在使用MYSQL 5。我在选择中使用了wt.widget_name as widgetname,gt.gizmo_name as gizmoname。它起作用,但有时会返回空字段,因此CASE似乎可以解决这个问题。 完美运行,再次感谢! 我每天都学到一些东西。好吧,至少当我寻求帮助时是这样。 :) - gbroke
显示剩余3条评论

1
SELECT 
    maintable.field1,
    maintable.field2,
    maintable.field3,
    CASE maintable.field2
    WHEN 1 THEN widgettable.widget_name
    WHEN 2 THEN gizmotable.gizmo_name
    END AS consolidated_name
FROM      maintable
LEFT JOIN widgettable ON widgettable.widgetid = maintable.field3
LEFT JOIN gizmottable ON gizmottable.gizmoid  = maintable.field3
WHERE     maintable.field1 = 'passed in parameter'

谢谢回复。虽然其他答案有效,但我也会尝试这个并向任何查看此页面的人报告结果。我对CASE WHEN很好奇,我从未使用过它。 - gbroke

1

这听起来有点像 UNION 查询,只是您没有指定要查看连接表中的任何数据。这意味着内部连接只是存在性检查;它们检查连接表中是否有与主表中的行匹配的行。我采取了“激进”的步骤,假设您想从连接表中获取一些列;您可以省略这些连接列而不会严重改变整体效果。此 UNION 查询假定您需要从 WidgetTable 和 GizmotTable 中获取的列足够相似。然后您可以编写:

SELECT m.field1,
       m.field2,
       m.field3,
       w.column1,
       w.column3
  FROM maintable   AS m
  JOIN widgettable AS w ON w.widgetid = m.field3
 WHERE m.field1 = passed_in_parameter
   AND m.field2 = 1

UNION

SELECT m.field1,
       m.field2,
       m.field3,
       g.attribute23,
       g.attribute19
  FROM maintable   AS m
  JOIN gizmottable AS g ON g.gizmoid = m.field3
 WHERE m.field1 = passed_in_parameter
   AND m.field2 = 2

你所寻找的直接类比是:

SELECT m.field1, m.field2, m.field3,
  FROM maintable   AS m
  JOIN widgettable AS w ON w.widgetid = m.field3
 WHERE m.field1 = passed_in_parameter
   AND m.field2 = 1
UNION
SELECT m.field1, m.field2, m.field3,
  FROM maintable   AS m
  JOIN gizmottable AS g ON g.gizmoid = m.field3
 WHERE m.field1 = passed_in_parameter
   AND m.field2 = 2

谢谢您的回复。虽然另一种方法可行,但我也会尝试这个并向任何查看此页面的人报告结果。 - gbroke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接