【问题标题】:Joining 2 tables with MySQL用 MySQL 连接 2 个表
【发布时间】:2015-05-30 11:28:54
【问题描述】:

我有 3 张桌子:

Table User => id, name

Table Tag  => id, tag_name, used, status

Table User_tag => id, user_id, tag_id, inserted_at 

*其中user_id引用USER表的id字段,tag_id引用TAG表的id字段)

我的问题是: 我想选择所有标签并根据标签在user_tag中出现的次数对其进行排序,如果user_tag上根本没有出现,则根据TAG表上的USED字段对其进行排序。

我试过这样:

SELECT tag.*, COUNT(user_tag.id) as number_of_appear FROM tag 
  LEFT JOIN user_tag ON tag.id = user_tag.tag_id 
  WHERE tag.status = 1 AND user_tag.user_id = 2 
  GROUP BY tag.tag 
  ORDER BY number_of_appear DESC, tag.used DESC

在这种情况下,user_tag 表中没有 user_id = 2。这就是它返回 0 记录的原因。即使 user_tag 表上没有记录,我也希望它仍然返回一个 tag_name 。如果标签 id 根本没有出现,请根据 tag.used 字段对其进行排序。

我的目的是为用户创建一个标签选项,但我想从用户最常用的标签中对其进行排序。所以用户不必滚动搜索他们最喜欢的标签。

谁能帮帮我?

【问题讨论】:

  • 感谢灵魂纠正我的问题 T.T .. 堆栈溢出还是新手~

标签: php mysql


【解决方案1】:
SELECT tag.name, 
    (SELECT count(*) as amount
     FROM user_tag
     JOIN tag ON tag.id = user_tag.tag_id
     WHERE tag.status = 1 AND user_tag.user_id = 2 AND tag.id = t.id
    ) as total
FROM tag as t
ORDER BY total 

【讨论】:

  • 不能,它不返回任何记录,因为 USER_TAG 表上没有 user_id = 2 的记录。我希望即使 USER_TAG 表中没有 user_id = 2 的记录,它仍然返回一行,所以我可以得到 tag_name
  • 这就是为什么我不明白你为什么想要一个 where 子句
  • 我的目的是为用户创建一个标签选项,但我想从用户最常用的标签中对其进行排序。所以用户不必滚动搜索他们最喜欢的标签。因此 SELECT 查询必须返回 ALL TAGS 名称,从用户最常使用的名称开始排序。
  • 我需要 WHERE 子句来计算用户使用 A TAG 的次数,假设 Marcel 使用了:标记“烹饪”2 次,标记“爱好”5 次,标记“运动”0 次。它必须返回这个 -> 爱好、烹饪、运动(按此顺序)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
相关资源
最近更新 更多