有没有更有效的方法来做到这一点而不计算两次?
即如果计数为0则返回警告图像字符串,否则返回计数。
IF(
((SELECT COUNT(pc.category_id) from product_categories pc WHERE pc.product_id = cp.ItemID) > 0),
(SELECT COUNT(pc.category_id) from product_categories pc WHERE pc.product_id = cp.ItemID),
"<img src=\"_imgs/warning.png\" alt=\"warning\"/>"
) AS category_count
答案 0 :(得分:2)
使用变量。 (但我认为其结果可能会被查询缓存缓存。)
IF( @val:=(query here), @val, "other value" ) AS category_count
答案 1 :(得分:0)
您可以使用NULLIF
和COALESCE
的组合,例如
COALESCE( NULLIF((sub-query), 0), 'other value')
但是,您不应该在数据库查询中构建HTML。这意味着您不需要任何复杂的SQL,这将成为视图中的简单if语句。
答案 2 :(得分:0)
您也可以加入此表格,例如 -
SELECT
cp.*,
IF(pc.cnt > 0, pc.cnt, '<img src=\"_imgs/warning.png\" alt=\"warning\"/>')
FROM
cp_table cp
LEFT JOIN (
SELECT product_id, COUNT(category_id) AS cnt FROM product_categories GROUP BY product_id
) pc
ON pc.product_id = cp.ItemID
答案 3 :(得分:0)
简单就是使用COALESCE。当两个参数相同时,NULLIF返回null,并且当遇到NULL时,COALESCE帮助我们返回默认值。
select COALESCE(NULLIF(COUNT(pc.category_id),0),"<img src=\"_imgs/warning.png\" alt=\"warning\"/>") AS category_count