【问题标题】:Group by and order with joining tables使用连接表进行分组和排序
【发布时间】:2010-11-18 20:31:12
【问题描述】:

我在对必须在 Mysql 中分组的连接表的结果进行排序时遇到问题。

这是我的表格设置。

所有者表

  • owner_id |所有者名称
  • 1 |测试所有者 1
  • 2 |测试所有者 2
  • 3 |测试所有者 3

图片上传表

  • image_id |图像名称 |所有者 |上传日期
  • 1 |图片1.jpg | 2 | 04-08-2009
  • 2 |图片2.jpg | 1 | 04-08-2009
  • 3 |图片3.jpg | 3 | 04-08-2009
  • 4 |图片4.jpg | 1 | 04-08-2009
  • 5 |图片5.jpg | 3 | 04-08-2009

owner_id 字段是自动递增的,image_id 字段也是如此。

我想要做的是获取最后三个上传图片的 owner_name,但不是同一所有者。因此,在该示例中,我希望它返回以下结果。

测试所有者 3 测试所有者 1 测试所有者 2

在该示例中,最后上传的所有者是测试所有者 3,然后是测试所有者 1,然后是测试所有者 2。

我正在使用以下查询,但它没有返回正确的结果

$sql = "SELECT u.*, s.* FROM UPLOAD_TBL u, OWNER_TBL s WHERE u.ownerid = s.owner_id
GROUP BY s.owner_id ORDER BY u.image_id DESC LIMIT 0, 3";

任何帮助设置此查询将不胜感激。

【问题讨论】:

  • 你的 SELECT 语句现在是什么样子的?

标签: mysql group-by


【解决方案1】:

看看是否可以对聚合后的图片 id 进行排序:

select s.owner_id, s.owner_name, max(u.imag_id) as last_image_id
from UPLOAD_TBL u
inner join OWNER_TBL s on s.ownerid = u.owner_id
group by s.owner_id, s.owner_name
order by last_image_id desc
limit 3

【讨论】:

  • 这是完美的。谢谢!效果很好。
【解决方案2】:

怎么样:

选择
     不同的(所有者 ID),所有者名称
从
     所有者
内部联接
     images.ownerid 上的图像 = owner.ownerid
订购
     images.upload_date desc 限制 3

【讨论】:

  • 我不是 SQL 人,但不应该是“FROM 所有者,图像”,因为您“稍后会调用图像?另外,考虑到想要的结果,左连接就足够了,没有?
【解决方案3】:

您应该简单地按 owner_id 分组并按 upload_date DESC 和 LIMIT 3 排序

【讨论】:

  • 感谢您的回复。我尝试了以下方法,但没有返回正确的结果。 $sql = "SELECT u.*, s.* FROM UPLOAD_TBL u, OWNER_TBL s WHERE u.ownerid = s.owner_id GROUP BY s.owner_id ORDER BY u.image_id DESC LIMIT 0, 3";
  • 你正在使用别名,它们让我眼前一亮,但我认为你的 WHERE 放错了位置如何 SELECT * FROM OWNER_TBL LEFT JOIN UPLOAD_TBL ON owner_id=ownerid GROUP BY owner_id ORDER BY image_id DESC LIMIT 3 如果你在第二个表中将 ownerid 的名称更改为 owner_id 您可以使用更简单的 LEFT JOIN UPLOAD_TBL USING(owner_id) (或任何其他连接)Sequ3L 答案看起来更优雅,但您应该使用 EXPLAIN 能够知道哪个更快跨度>
  • 也感谢您的帮助。这也符合我的需要。 :)
猜你喜欢
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多