【问题标题】:MySQL Query depending on column value define where statementMySQL Query 根据列值定义 where 语句
【发布时间】:2013-01-01 00:44:52
【问题描述】:

我有这个 SQL:

SELECT
  `refnumbers`.`order_id`,
  `refnumbers`.`deal_id`,
  `refnumbers`.`claim_track_id`,
  `deals`.`partner_count`
FROM `refnumbers`
  JOIN `deals`
    ON (`refnumbers`.`deal_id` = `deals`.`ID`)
  JOIN `users`
    ON (`users`.`id` = `deals`.`partner_id`)
WHERE `refnumbers`.`is_claimed` = '1'
    AND `deals`.`partner_id` = '62039'
    AND `refnumbers`.`claimed_at` BETWEEN '2013-01-17 00:00:00'
    AND '2013-01-17 23:59:59'
ORDER BY `refnumbers`.`claimed_at` DESC

如果 deals.partner_count 为 1,我想选择 deals.partner_id = 62039 的位置。

如果 partner_count 不是 1 那么它应该选择 where refnumbers.claim_track_id = 62039

如何做到这一点?

【问题讨论】:

  • 可以使用条件 MySQL 关键字 CASE WHEN...THEN...END

标签: mysql sql select if-statement


【解决方案1】:

试试这个:

SELECT r.order_id, r.deal_id,r.claim_track_id, d.partner_count
FROM refnumbers r
INNER JOIN deals d ON r.deal_id = d.ID
INNER JOIN users u ON d.partner_id = u.id 
WHERE IF(d.partner_count = 1, d.partner_id = '62039', r.claim_track_id = 62039) AND 
      r.is_claimed = '1' AND r.claimed_at BETWEEN '2013-01-17 00:00:00' AND '2013-01-17 23:59:59'
ORDER BY r.claimed_at DESC

【讨论】:

    【解决方案2】:

    试试

    where
    case when deals.partner_count = 1 
       then deals.partner_id = 62039
       else refnumbers.claim_track_id = 62039
    end
    

    【讨论】:

      【解决方案3】:

      你需要有一个括号括在使用OR的条件

      SELECT  `refnumbers`.`order_id`, 
              `refnumbers`.`deal_id`, 
              `refnumbers`.`claim_track_id`, 
              `deals`.`partner_count`
      FROM    `refnumbers` 
              INNER JOIN `deals` 
                  ON (`refnumbers`.`deal_id` = `deals`.`ID`) 
              INNER JOIN `users` 
                  ON (`users`.`id` = `deals`.`partner_id`) 
      WHERE   `refnumbers`.`is_claimed` = '1'  AND 
              `refnumbers`.`claimed_at` BETWEEN '2013-01-17 00:00:00' AND '2013-01-17 23:59:59' 
              AND
              (
                  (deals.partner_id = 62039 AND deals.partner_count = 1)
                  OR
                  (refnumbers.claim_track_id = 62039 AND deals.partner_count <> 1)
              )
      ORDER BY `refnumbers`.`claimed_at` DESC
      

      【讨论】:

      • MySQL CASE WHEN...THEN...END 可以用更简单的方式做到这一点:)
      • @TrungHieuLe 有很多方法可以解决问题,有人已经发布了使用CASE
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 2011-08-07
      相关资源
      最近更新 更多