【问题标题】:MySQL: how can I count number of articles by a join tableMySQL:如何通过连接表计算文章数
【发布时间】:2013-10-29 15:10:28
【问题描述】:

我有一个包含新闻项目的表,我还有另一个包含 media_types 的表,我想进行一个简单的查询,读取 media_types 表并计算每条记录有多少 news_items 存在。

结果将转换为我将用于图表的 json 响应,这是我的 SQL 语句

SELECT
  gc.country AS "country"
, COUNT(*) AS "online"
FROM default_news_items AS ni
JOIN default_news_item_country AS nic ON (nic.id = ni.country)
JOIN default_country AS c ON (nic.country = c.id)
JOIN default_geo_country AS gc ON (gc.id = c.geo_country)
LEFT JOIN default_medias ON (m.id = ni.media)
WHERE TRUE
  AND ni.deleted = 0
  AND ni.date_item > '2013-10-23'
  AND ni.date_item < '2013-10-29'
AND gc.country <> 'unknown'
AND m.media_type = '14'
GROUP BY gc.country
ORDER BY `online` desc LIMIT 10

这是我从 mysql 响应创建的 json 响应

   [
     {"country":"New Zealand","online":"7"},
     {"country":"Switzerland","online":"1"}
   ]

如何像这样将打印和社交数据添加到我的输出中

我希望 json 响应看起来像这样

   [
     {"country":"New Zealand","online":"7", "social":"17", "print":"2"},
     {"country":"Switzerland","online":"1", "social":"7", "print":"1"}
   ]

我可以在 select 语句中使用count (*) 来做这样的事情吗

COUNT( * ) as online, COUNT( * ) as social, COUNT( * ) as print

是否有可能或者我必须执行几个 SQL 语句来获取我正在寻找的数据?

【问题讨论】:

    标签: mysql sql json


    【解决方案1】:

    这是一般结构:

    SELECT default_geo_country.country as country,
           SUM(default_medias.media_type = 14) as online,
           SUM(default_medias.media_type = XX) as social,
           SUM(default_medias.media_type = YY) as print
    FROM ...
    JOIN ...
    WHERE ...
    GROUP BY country
    

    【讨论】:

      【解决方案2】:

      我认为您需要条件聚合。但是,您的问题仅显示在线媒体类型。

      通过使用表别名并删除反引号,您的查询将更具可读性。此外,如果media_type 是一个整数,那么您不应该将用于比较的常量用单引号括起来——我首先发现将字符串常量与整数列进行比较会产生误导。

      我怀疑这是你想走的路。 . . . 所在的位置,您要填写其他媒体类型的计数。

      SELECT default_geo_country.country as country,
             sum(media_type = '14') as online,           
             sum(default_medias.media_type = XX) as social,
             sum(default_medias.media_type = YY) as print
             . . . 
      FROM default_news_items ni JOIN
           default_news_item_country nic
           ON nic.id = ni.country JOIN
           default_country dc 
           ON nic.country = dc.id JOIN
           default_geo_country gc
           ON gc.id = dc.geo_country LEFT JOIN
           default_medias dm
           ON dm.id = dni.media
      WHERE ni.deleted = '0' 
       AND ni.date_item > '2013-10-23' 
       AND ni.date_item < '2013-10-29' 
       AND gc.country <> 'unknown' 
      GROUP BY gc.country
      ORDER BY online desc
      LIMIT 10
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-06
        • 2013-07-12
        • 1970-01-01
        • 2011-09-02
        • 2015-07-12
        • 1970-01-01
        • 2011-08-15
        • 1970-01-01
        相关资源
        最近更新 更多