当前位置: 首页 > 面试题库 >

我可以联接两个表,从而使联接的表按某个列排序吗?

秦宁
2023-03-14
问题内容

我不是数据库专家,所以我需要一些有关正在处理的查询的帮助。在我的照片社区项目中,我不仅要显示标签名称和计数器(标签中的图像数量),而且还想显示标签中最受欢迎的图像(最因果),以丰富标签的可视化效果。

表设置如下:

  • 图像表包含基本图像元数据,重要的是因果字段
  • Imagefile表每个图像包含多个条目,每种格式一个
  • 标签表保存标签定义
  • Tag_map表将标签映射到图像

在我通常的试验和错误查询创作中,我走到了这一步:

SELECT * FROM

(SELECT tag.name, tag.id, COUNT(tag_map.tag_id) as cnt
FROM tag INNER JOIN tag_map ON (tag.id = tag_map.tag_id)
INNER JOIN image ON tag_map.image_id = image.id
INNER JOIN imagefile on image.id = imagefile.image_id 
WHERE imagefile.type = 'smallthumb'
GROUP BY tag.name
ORDER BY cnt DESC)

as T1 WHERE cnt > 0 ORDER BY cnt DESC

[为简单起见,内部查询的列子句被删除]

这个查询给了我一些我需要的东西。外部查询可确保仅返回至少包含1张图片的标签。内部查询返回标签详细信息,例如其名称,计数(图像数量)和拇指。另外,我可以根据需要对内部查询进行排序(按大多数图像,按字母顺序,最新等)

到目前为止,一切都很好。但是,问题在于此查询与标签中最流行的图像(大多数业力)不匹配,它似乎总是采用标签中的最新图像。

如何确定最受欢迎的图片与标记匹配?


问题答案:

这应该非常接近:

SELECT
  tag.id, 
  tag.name,
  tag_group.cnt,
  tag_group.max_karma,
  image.id, 
  imagefile.filename
  /* ... */
FROM
  tag
  /* join against a list of max karma values (per tag) */
  INNER JOIN (
    SELECT   MAX(image.karma) AS max_karma, COUNT(image.*) cnt, tag_map.tag_id
    FROM     image
             INNER JOIN tag_map ON tag_map.image_id = image.id
    GROUP BY tag_map.tag_id
  ) AS tag_group ON tag_group.tag_id = tag.id
  /* join against a list of image ids (per max karma value and tag) */
  INNER JOIN (
    SELECT   MAX(image.id) id, tag_map.tag_id, image.karma
    FROM     image
             INNER JOIN tag_map ON tag_map.image_id = image.id
    GROUP BY tag_map.tag_id, image.karma /* collapse >1 imgs with same karma */
  ) AS pop_img ON pop_img.tag_id = tag.id AND pop_img.karma = tag_group.max_karma
  /* join against actual base data (per popular image id) */
  INNER JOIN 
    image ON image.id = pop_img.id
  INNER JOIN
    imagefile ON imagefile.image_id = pop_img.id AND imagefile.type = 'smallthumb'

基本上,这是一个经常出现的“每个组的最大值”问题:如何选择与一个组的最大值/最小值相对应的记录?

通常的答案通常是:选择组(tag_id, MAX(image.karma)),然后根据这些特征将基础数据结合起来。可能存在特定于DBMS的专有扩展,它们采用了不同的方法,例如,使用ROW_NUMBER()/PARTITION BY。但是,它们不是很方便携带,在使用不支持它们的DBMS时可能会挠头。



 类似资料:
  • 问题内容: 谁能告诉我如何编写查询并如上所述获取结果,谢谢!我试过加入,左右加入。一切都没有结果。 问题答案: 您可以在这两个表之间写左外部联接最好的理解方法是检查下图 查询您的要求 阅读有关 代码项目的 原始文章将对您有很大帮助:SQL Joins的可视表示 。 在以下位置找到原始版本:MySQL中的JOIN和OUTER JOIN之间的区别 。

  • 我有以下表格: 以及: 以及: 数据库是PostgreSQL 如何订购table_1按日期列table_2和table_3联接表在Laravel? 这可以用雄辩来完成吗? 编辑:如果可以使用Elounce完成,则预期结果是表1模型的集合,表2和表3的关系由表2和表3中的日期列排序 编辑2: 表1的asc排序的预期结果。添加日期列是为了快速参考,不是必需的。

  • 我是(My)SQL的新手,需要一些帮助:在数据库中,我有3个表,一个例子: 购买: 制造者: 型号: 在表purchases中,model是一个外键,它链接到model.id。在模型中,“制造商”是一个外键,它与“制造商id”相链接。 我的目标是一个如下图所示的表格: 我知道如何在表购买中加入以获取型号的名称。不幸的是,我不知道如何获取制造商? 我的SQL-查询:

  • 问题内容: 我有一个模型可以使用“使行为成为现实”宝石(Github页面)进行投票。投票系统工作正常,但我尝试显示按每个页面有多少排序的页面。 目前,我的控制器根据标签提取资源,但未排序: 如果我使用单个资源并调用“ @ resource.votes.size”,它将返回其拥有的票数。但是,票数是另一张桌子,因此我认为需要进行某种形式的合并,但我不确定如何进行。我需要的是一个可以这样显示的漂亮的有

  • 问题内容: 我有两个表: 服务 ID 客户 服务 和 客户 ID 名称 电子邮件 如何列出表服务并将客户表的客户名称汇总在一起?该表中的现场客户服务在客户表上具有该客户的ID, 我感谢您的帮助 问题答案:

  • 问题内容: 我正在尝试运行以下查询,但继续遇到相同的错误 查询失败错误:在第6行第33列遇到“”。 查询是: 从[Dataset1.1_0_MEMBER_GROUP]中 选择1_0_MEMBER_GROUP.User_Group, 1_0_MEMBER_GROUP.Member_ID, 1_4_MEMBER_TRAN_YEAR.MEMBER_UID 在1_0_MEMBER_GROUP_YEAR_M