【问题标题】:Mysql Join:get total favourites for each item along with each rowMysql Join:获取每个项目以及每一行的总收藏夹
【发布时间】:2017-07-28 12:45:25
【问题描述】:

DB 的示例输入

1)cushbu_users

id first_name last_name email 
   1   sh        s         sh@sh.com
   2   sb        s         sh1@sh.com   

2)cushbu_art

   id user_id title   image_name 
   1    1     cool    cool.jpeg
   2    2     funny   funny.jpeg   
   3    1     blaaa   blaa.jpeg
   4    2     foo     foo.jpeg

3)cushbu_mark_user_favorites-存储收藏项的详细信息

 id user_id art_id
  1   1       1
  2   1       2
  3   2       1
  4   2       2 

 As you see two users Favorited  two arts so the total count 
 for favourite of each art is `two`

我想得到每个用户最喜欢的艺术,并且完全喜欢

我的 id=1 用户的例外输出

art_id artist_name total_fav
1       sh s        2
2       sb s        2

这是对它的查询

    SELECT
        cushbu_art.id AS art_id,
        cushbu_art.title,
        cushbu_art.image_name,
        CONCAT(
            cushbu_users.first_name,
            ' ',
            cushbu_users.last_name
        ) AS artist_name , count(cushbu_mark_user_favorites.id)  as total_fav
    FROM
        cushbu_mark_user_favorites 
    LEFT JOIN cushbu_art ON cushbu_art.id=cushbu_mark_user_favorites.art_id
    LEFT JOIN cushbu_users ON cushbu_users.id = cushbu_art.artist_id
    WHERE cushbu_mark_user_favorites.user_id=1
    GROUP BY cushbu_art.id

但它会返回

art_id artist_name total_fav
    1       sh s        1
    2       sb s        1

每行仅返回total_fav 1,但例外输出2

【问题讨论】:

    标签: mysql node.js join


    【解决方案1】:

    问题是您正在过滤WHERE cushbu_mark_user_favorites.user_id=1,因此无法从其他用户那里获得收藏的数量。这个想法是第二次加入表,但没有这个限制。 推测,未经测试...

    SELECT
        cushbu_art.id AS art_id,
        cushbu_art.title,
        cushbu_art.image_name,
        CONCAT(
            cushbu_users.first_name,
            ' ',
            cushbu_users.last_name
        ) AS artist_name , b.favorites_count as total_fav
    FROM
        cushbu_mark_user_favorites 
    LEFT JOIN cushbu_art ON cushbu_art.id=cushbu_mark_user_favorites.art_id
    LEFT JOIN cushbu_users ON cushbu_users.id = cushbu_art.artist_id
    LEFT JOIN (SELECT art_id,count(*) as favorites_count FROM cushbu_mark_user_favorites GROUP BY art_id) as b ON b.art_id=cushbu_art.id
    WHERE cushbu_mark_user_favorites.user_id=1
    GROUP BY cushbu_art.id
    

    【讨论】:

    • cushbu_mark_user_favorites.user_id=附近得到一个sql语法错误
    • 返回另一个错误在没有 GROUP BY 的聚合查询中,SELECT 列表的表达式 #1 包含非聚合列 'cushbu_db.cushbu_mark_user_favorites.art_id';这与 sql_mode=only_full_group_by 不兼容
    • 抱歉,我不应该尝试在没有测试的情况下一口气写完所有内容......现在?
    • 返回空行
    • 对不起,让我再次检查一下用户 ID 的问题
    【解决方案2】:

    由于您正在执行 GROUP BY cushbu_art.id,这就是它返回 1 的原因。对于您想要的输出,您可以执行子查询,分别获取计数。

    `SELECT
            cushbu_art.id AS art_id,
            cushbu_art.title,
            cushbu_art.image_name,
            CONCAT(
                cushbu_users.first_name,
                ' ',
                cushbu_users.last_name
            ) AS artist_name , (select count(*) from cushbu_mark_user_favorites a where a.id=b.id )  as total_fav
        FROM
            cushbu_mark_user_favorites b
        LEFT JOIN cushbu_art ON cushbu_art.id=cushbu_mark_user_favorites.art_id
        LEFT JOIN cushbu_users ON cushbu_users.id = cushbu_art.artist_id
        WHERE cushbu_mark_user_favorites.user_id=1
        GROUP BY cushbu_art.id
    `
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 2015-09-29
      • 2020-07-11
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多