我现在知道,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'])}
Run Code Online (Sandbox Code Playgroud)
既然我知道这是无效的语法,那么最接近的选择是什么?
Álv*_*lez 14
它可能需要调整以返回正确的结果,但我希望你明白这个想法:
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
Run Code Online (Sandbox Code Playgroud)
编辑:
一点关于CASE...END.您的原始代码不会运行,因为与PHP或JavaScript不同,SQL CASE不是允许选择代码的哪一部分运行的流控制结构.相反,它返回一个表达式.所以你可以这样做:
SELECT CASE
WHEN foo<0 THEN 'Yes'
ELSE 'No'
END AS is_negative
FROM bar
Run Code Online (Sandbox Code Playgroud)
......但不是这个:
-- Invalid
CASE
WHEN foo<0 THEN SELECT 'Yes' AS is_negative
ELSE SELECT 'No' AS is_negative
END
FROM bar
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14225 次 |
| 最近记录: |