select:基于显式值出现的结果

select: result based on occurrence of explicit value

给定如下 mysql table:

CREATE TABLE fonts
    (`id` int, `fontName` varchar(22), `price` int,`reducedPrice` int,`weight` int)
;

INSERT INTO fonts
    (`id`, `fontName`, `price`,`reducedprice`,`weight`)
VALUES
    (1, 'regular', 50,30,1),
    (2, 'regular-italic', 50,20,1),
    (3, 'medium', 60,30,2),
    (4, 'medium-italic', 50,30,2),
    (5, 'bold', 50,30,3),
    (6, 'bold-italic', 50,30,3),
    (7, 'bold-condensed', 50,30,3),
    (8, 'super', 50,30,4)
;

例如,用户选择以下 ID:1,2,3,5,6,7 这将导致以下 query/result:

> select * from fonts where id in(1,2,3,5,6,7);

id  fontName        price       reducedPrice    weight
1   regular         50          30              1
2   regular-italic  50          20              1
3   medium          60          30              2
5   bold            50          30              3
6   bold-italic     50          30              3
7   bold-condensed  50          30              3

是否可以在查询中使用一种 "if statement" 来 return 基于列权重的新字段。如果一个值不止一次出现,reducedPrice 应该 returned as newPrice else price:

id  fontName        price   reducedPrice    weight    newPrice
1   regular         50      30              1         30
2   regular-italic  50      20              1         20
3   medium          60      30              2         60
5   bold            50      30              3         30
6   bold-italic     50      30              3         30
7   bold-condensed  50      30              3         30

这意味着 ids 1,2,5,6,7 应该减少但 id 3 不是因为它的权重“2”只出现一次

请在此处查找 fiddle:http://sqlfiddle.com/#!9/73f5db/1 感谢您的帮助!

select *,if(occurences>=2,reducedPrice,price) as newPrice from fonts
left join (Select count(id) as occurences, id,weight from fonts
where fonts.id in(1,2,3,5,6,7) group by weight) t on t.weight = fonts.weight
where fonts.id in(1,2,3,5,6,7);

mysql if 关键字参考在这里:https://dev.mysql.com/doc/refman/5.1/en/control-flow-functions.html#function_if

编辑:添加了 fiddle,根据评论请求更改为实例。 已更新 fiddle:http://sqlfiddle.com/#!9/a93ef/14

编写一个子查询,获取每个权重的出现次数,并与之连接。然后你可以测试出现的次数来决定把哪个字段放在NewPrice.

SELECT f.*, IF(weight_count = 1, Price, ReducedPrice) AS NewPrice
FROM fonts AS f
JOIN (SELECT weight, COUNT(*) AS weight_count
      FROM fonts
      WHERE id IN (1, 2, 3, 5, 6, 7)
      GROUP BY weight) AS w ON f.weight = w.weight
WHERE id IN (1, 2, 3, 5, 6, 7)

Updated fiddle

SELECT DISTINCT x.*
              , CASE WHEN y.weight = x.weight THEN x.reducedPrice ELSE x.price END newPrice 
           FROM fonts x 
           LEFT 
           JOIN 
              ( SELECT * FROM fonts WHERE id IN(1,2,3,5,6,7) )y
             ON y.weight = x.weight 
            AND y.id <> x.id  
          WHERE x.id IN(1,2,3,5,6,7)
          ORDER 
             BY id;