【问题标题】:MySQL query where JOIN depends on CASEJOIN 取决于 CASE 的 MySQL 查询
【发布时间】:2011-08-09 10:36:26
【问题描述】:

据我所知,CASE 只能在 WHERE 上下文中使用。不过,我需要根据column 值使用不同的表。我尝试过的看起来像这样:

SELECT
    `ft1`.`task`,
    COUNT(`ft1`.`id`) `count`
FROM
    `feed_tasks` `ft1`
CASE
    `ft1`.`type`
WHEN
    1
THEN
    (INNER JOIN `pages` `p1` ON `p1`.`id` = `ft1`.`reference_id`)
WHEN
    2
THEN
    (INNER JOIN `urls` `u1` ON `u1`.`id` = `ft1`.`reference_id`)
WHERE
    `ft1`.`account_id` IS NOT NULL AND
    `a1`.`user_id` = {$db->quote($user['id'])}

既然我知道这是无效的语法,那么最接近的替代方法是什么?

【问题讨论】:

  • 你应该合并pagesurls
  • 您从哪里读到 CASE 只能在 WHERE 子句中使用?这不是真的。
  • 合并就像字面上的“将两个数据库合并为一个”?好吧,在这种情况下,这不是一个选择,因为它们都有完全不同的结构。 @Álvaro G. Vicario:无论哪种方式,这都不是有效的语法。因此,我要求另一种选择。
  • merge two TABLES into one TABLE,完全不同?至少两个表都有user_idreference_id 列,那么完全在哪里?
  • 好吧,其他 10 列,也许?

标签: mysql sql


【解决方案1】:

它可能需要调整才能返回正确的结果,但我希望你明白:

SELECT ft1.task, COUNT(ft1.id) AS count
FROM feed_tasks ft1
LEFT JOIN pages p1 ON ft1.type=1 AND p1.id = ft1.reference_id
LEFT JOIN urls u1 ON ft1.type=2 AND u1.id = ft1.reference_id
WHERE COALESCE(p1.id, u1.id) IS NOT NULL
AND ft1.account_id IS NOT NULL
AND a1.user_id = :user_id

编辑:

关于CASE...END 的一点说明。您的原始代码无法运行,因为与 PHP 或 JavaScript 不同,SQL CASE 不是允许选择代码的哪一部分将运行的流控制结构。相反,它返回一个表达式。所以你可以这样做:

SELECT CASE
    WHEN foo<0 THEN 'Yes'
    ELSE 'No'
END AS is_negative
FROM bar

...但不是这个:

-- Invalid
CASE 
    WHEN foo<0 THEN SELECT 'Yes' AS is_negative
    ELSE SELECT 'No' AS is_negative
END
FROM bar

【讨论】:

  • 它适用于两个左连接但是当我添加第三个选项时它返回一个错误
  • @YosraNagati 连接语法中没有任何内容将其限制为给定数量的表。错误消息可能是由于您的代码中的错误。
  • 我的立场是正确的:在 MySQL 中你只能加入 61 tables at a time
【解决方案2】:

在两个表上使用外连接并将CASE 移动到您的COUNT 中:

SELECT
    ft1.task,
    COUNT(case ft1.id when 1 then p1.id when 3 then u1.id end) as count
FROM feed_tasks ft1
LEFT JOIN pages p1 ON p1.id = ft1.reference_id
LEFT JOIN urls u1 ON u1.id = ft1.reference_id
WHERE ft1.account_id IS NOT NULL
AND a1.user_id = {$db->quote($user['id'])}

CASE 的未命中将提供 null id 并且不会被计算在内。

注意:表 a1 在您的 where 子句中,但似乎不是选定的表

【讨论】:

    猜你喜欢
    • 2013-05-23
    • 2017-10-26
    • 2011-09-01
    • 1970-01-01
    • 2011-03-04
    • 2014-09-15
    • 1970-01-01
    • 2016-04-06
    • 2017-09-14
    相关资源
    最近更新 更多