【问题标题】:MYSQL SQL statement. Is this conditional query possible?MYSQL SQL 语句。这个条件查询可能吗?
【发布时间】:2012-04-19 19:14:29
【问题描述】:

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他们俩
  • 不,它不是有效的 SQL 语法。
  • 你想从 widgettable 或 gizmotable 中选择任何东西吗?
  • @Amit Bhargav - 我需要 widgettable.widget_name 或 gizmotable.gizmo_name
  • 我想你可以做一个INNER JOIN widgettable on widgettable.widgetid = field3 AND maintable.field2 = 1 INNER JOIN gizmottable on gizmottable.gizmoid = field3 AND maintable.field2 = 2

标签: mysql sql conditional


【解决方案1】:

正如 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 我的错……我通常不使用 mysql。忘了外层可以省略。谢谢!
  • nono,mysql 忽略它。因此,您只需使用另一个与它们不同的数据库。这就是我问的:-)
  • @zerms 是的,我通常使用 Oracle
  • @Amit Bhargava 看起来您从原始帖子中更改了它。我尝试了您拥有的第一个,带有“外部”且没有 CASE 语句。那是有效的。
【解决方案2】:

这听起来有点像 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

【讨论】:

  • 感谢您的回复。即使不同的响应有效,我也会尝试此操作并向查看此页面的任何人报告。
【解决方案3】:
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。我从来没用过。
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2011-05-12
  • 2014-09-21
  • 1970-01-01
  • 2023-03-07
  • 2010-12-21
相关资源
最近更新 更多