0

我有一张桌子,例如

Artist     Title      Song Key   Easytosing
A          Title A    A          No
A          Title A    B          Yes
A          Title A    F          Yes
B          Title B    A          Yes
C          Title C    F#         No

我想返回标记为“easytosing”的每首歌曲,但也显示该歌曲有多少个版本 a) easytosing b) 总数,例如理想的结果是:

Artist     Title       How_many_tot    How_many_easy
A          Title A     3               2
B          Title B     1               1

我可以显示有多少是容易唱歌的:

SELECT *, count(*) as How_many_easy from tracks
where easytosing='Yes' 
group by artist,title 
order by artist asc

有没有一种方法可以同时显示两者,所以查询只选择easytosing但计算全部?

4

5 回答 5

4
select count(*) HOW_MANY_TOT,
       sum(case EASYTOSING when 'Yes' then 1
                else 0
            end case) HOW_MANY_EASY
       ARTIST,
       TITLE
  from TRACKS
 group by ARTIST, TITLE
having HOW_MANY_EASY > 0
于 2013-09-02T09:20:38.163 回答
1

我建议您进行两次查询,一次查询数据,一次查询计数。您正在使用select *这意味着您正在选择整个表格,如果您只需要一个数字,这将是很多开销。

我已经建立了一个类似情况的网上商店,两个查询结果更快并且更容易维护。可以通过仅选择 1 列并删除order by.


另一种解决方案是对 count_value 使用子查询。子查询不支持限制,但您不需要它来计数。尽可能少地选择,无需订购

于 2013-09-02T09:19:27.467 回答
1
SELECT
  Artist,
  Title,
  COUNT(*) How_many_tot,
  SUM(Easytosing='yes') how_many_easy
FROM
  tracks
GROUP BY
  Artist, Title
HAVING
  SUM(Easytosing='yes')>0

在此处查看小提琴。

于 2013-09-02T09:22:12.230 回答
0

您必须向您的 talbe 添加一个唯一 ID(auto_increment,在我的查询中称为 ID),然后您可以获得所需的信息:

select tall.artist, tall.title, count(distinct tall.ID) as total, count(distinct teasy.ID) as easy from tracks as tall
left join tracks as teasy on teasy.artist=tall.artist and teasy.title=tall.title and teasy.easytosing='Yes'
group by tall.artist, tall.title
于 2013-09-02T09:34:48.500 回答
0

您是否尝试过将其设为子查询并添加 where 子句?

SELECT countTable.*, 
       count(*) as How_many_easy
FROM 
(
    SELECT Artist, 
           Title, 
           MAX(easytosing) as easytosing,
           count(*) as How_many_total 
    from tracks
    group by artist,title 
) countTable ON tracks.Artist
where easytosing='Yes'
group by artist,title 
order by artist asc

注意:如果存在这样的记录,则 MAX(easytosing) 应返回“是”,否则返回“否”。

于 2013-09-02T09:28:50.237 回答