【问题标题】:MySQL JOIN with IF conditions带有 IF 条件的 MySQL JOIN
【发布时间】:2011-02-15 19:37:55
【问题描述】:

我想通过查询获得一些结果,类似于:

SELECT 
    * FROM
    users LEFT JOIN
    IF (users.type = '1', 'private','company') AS details ON
    users.id = details.user_id WHERE
    users.id = 1

有什么想法吗?

【问题讨论】:

    标签: mysql join if-statement conditional-statements


    【解决方案1】:

    我确定这已经解决了,但对于有类似问题的人来说。

    您可以使用多个左连接从两个表中获取数据,然后使用 IF() 来确定您希望将哪一列作为结果。

    SELECT *, IF (users.type = 1, p.name, c.name) AS name FROM users
    LEFT JOIN private AS p ON (users.type = 1 AND users.id = p.user_id) 
    LEFT JOIN company AS c ON (users.type != 1 AND users.id = c.user_id)
    

    【讨论】:

      【解决方案2】:
      SELECT * FROM users 
      LEFT JOIN private AS details ON users.id = details.user_id 
      WHERE users.id = 1 AND users.type = 1
      
      UNION
      
      SELECT * FROM users 
      LEFT JOIN company AS details ON users.id = details.user_id 
      WHERE users.id = 1 AND users.type != 1
      

      我认为这就是你想要做的,不是吗?

      正如您现在所说的列数不同,您需要指定列,例如

      SELECT 'private' AS detailType, users.*, col1, col2, col3, '' FROM users 
      LEFT JOIN private AS details ON users.id = details.user_id 
      WHERE users.id = 1 AND users.type = 1
      
      UNION
      
      SELECT 'company', users.*, col1, '', '', col4  FROM users 
      LEFT JOIN company AS details ON users.id = details.user_id 
      WHERE users.id = 1 AND users.type != 1
      

      在这个例子中,private 有 col1、col2 和 col3 列,而 company 有 col1 和 col4,但你想要它们全部。

      【讨论】:

      • 我不知道为什么现在我得到了 #1222 - 使用的 SELECT 语句的列数不同
      • 如果我只使用一部分代码,即。 SELECT * FROM users LEFT JOIN private AS details ON users.id = details.user_id WHERE users.id = 1 AND users.type = 1 但如果我使用 UNION 我收到错误 #1222
      • 如果您在两个表(私人和公司)中有不同数量的列,那么您需要在 SELECT 中指定相同数量的列。您可以使用 NULL、'' 或任何您想要的内容来填充空白。
      • 但这没有意义。如果我有即。 5000 条私人记录,只有 2 条公司记录,所以我必须创建 4998 条空记录?
      • 不,假设记录是指行,列数必须匹配。我希望您的表中没有 5000 列!
      【解决方案3】:
      SELECT
        users.*,
        details.info,
        CASE users.type WHEN '1' THEN 'private' ELSE 'company' END AS user_type
      FROM
        users
        INNER JOIN (
          SELECT user_id, info FROM private
          UNION
          SELECT user_id, info FROM company
        ) AS details ON details.user_id = users.id
      

      编辑:答案的原始版本(问题被误解):

      SELECT
        *, 
        CASE type WHEN '1' THEN 'private' ELSE 'company' END AS details
      FROM
        users
      WHERE
        users.id = 1
      

      【讨论】:

      • 这不是我想要的。 private 和 company 是两个不同的表,我想加入:当 user.type == 1 我想要 JOIN private ON user.id = private.user_id 而当 user.type == 2 我想要 JOIN company ON user.id = company.user_id
      • @plugowski:查看更改后的答案。
      【解决方案4】:

      这里我分享的是 Magento2 SQL 查询中的 if else 条件,以获取报告订单详细信息客户登录和不登录,您只是根据情况增强了查询。

      SELECT 
          so.increment_id as ID,
          sog.customer_id as Customer_Id,
          sog.customer_name as Customer_Name,
          sog.customer_email as Customer_Email,
          CASE sog.customer_group 
              WHEN '1' THEN 'Custome Login'
              ELSE 'Not Login'
          END as Customer_Group,
          sog.grand_total as Grand_Total,
          sog.subtotal as Subtotal,
          sog.billing_name as Billing_Name,
          sog.billing_address as Billing_Address,
          sog.shipping_address as shipping_address,
          so.shipping_description as Shipping_Information,
          so.status as Status,
          so.cancel_order_username as Canceled_BY,
          so.cancel_order_currenttime as Cancellation_Time,
          so.cancel_order_comment as Cancellation_Reason
      FROM sales_order so
      LEFT JOIN sales_order_grid as sog ON sog.increment_id=so.increment_id
      WHERE so.cancel_order_currenttime >= Date('2018-10-01')
          AND so.cancel_order_currenttime <= Date('2018-12-05')
      

      这里我们根据情况创建了一些别名: so-&gt;sales_order table, sog-&gt;sales_order_grid,

      我们在客户组中使用 if/else 条件,因为我们知道,"0" 用于访客用户,"1" 用于登录用户,两者都用于客户组。

      我希望这个建议能帮助你解决困惑,如果你在理解这个答案时遇到任何问题,请告诉我。

      【讨论】:

        猜你喜欢
        • 2016-01-01
        • 1970-01-01
        • 2021-10-24
        • 2018-08-19
        • 1970-01-01
        • 2015-06-23
        • 2012-07-13
        • 2018-03-30
        • 2021-07-25
        相关资源
        最近更新 更多