【问题标题】:Finding username of the last post in mysql table joining 3 tables在mysql表中查找最后一个帖子的用户名加入3个表
【发布时间】:2015-05-14 13:58:50
【问题描述】:

我知道我做错了 - 它需要超过 10 秒的时间才能返回结果,其中只有 3000 行数据... 我有 3 个表:
users
身份证
用户名

DATA:
1|tom
2|dick
3|harry



帖子
身份证
id_users

DATA:
1|1
2|1
3|1
4|2
5|2
6|3

cronjobs
身份证
id_post
id_wall

DATA:   id|id_post|id_wall
1|1|1
2|1|2
3|1|3
4|1|4
5|1|5
6|2|5
7|4|3
8|6|3
9|4|4

用户会发帖 该帖子将放置在一面或多面墙上并存储在 cronjobs 表中。 cronjobs 上的 id 是自动递增的。 我需要在每面墙上获取用户名和最后一篇文章。 在上面的例子中

Dick 是最后一个在 4 号墙上发帖的人
哈利是最后一个在 3 号墙上发布 6 号帖子的人
汤姆是最后一个用帖子 2 在 5 墙上发帖的人
汤姆是最后一个用帖子 1 在 2 墙上发帖的人
汤姆是最后一个在 1 号墙上发帖的人

这是我当前使用的 qry,我知道在其中使用带有 select 的 IN 子句,正在扼杀这个....

SELECT 
  c.id,
  c.id_post,
  c.id_wall AS id_wall,
  p.id_users AS user_id,
  u.NAME AS username 
FROM
  cronjobs c,
  posts p,
  users u 
WHERE c.id IN 
  (SELECT MAX(id) 
  FROM
    cronjobs 
  GROUP BY id_wall) 
  AND c.id_post = p.id 
  AND p.id_users = u.id 
ORDER BY c.id 

感谢任何帮助!

【问题讨论】:

    标签: php mysql sql database


    【解决方案1】:

    试试这个

    SELECT 
      c.id,
      c.id_post,
      c.id_wall AS id_wall,
      p.id_users AS user_id,
      u.NAME AS username 
    FROM
      cronjobs c,
      posts p,
      users u ,
      (SELECT MAX(id) as id 
      FROM
        cronjobs 
      GROUP BY id_wall) table_id
      where c.id_post = p.id 
      AND p.id_users = u.id 
    and table_id.id  =c.id
    ORDER BY c.id
    

    【讨论】:

    • 太棒了!非常感谢!下面的 qry 也有效,两者的执行时间相同,这是第一个,所以我将其标记为答案。再次感谢
    【解决方案2】:

    您可以在where 子句中使用连接而不是子查询,join 部分中的子查询将执行一次,而where 子句中的子查询将对所有结果行执行此查询将比您的查询执行得更好,还索引出现在on() 部分中的列

    SELECT 
      c.id,
      c.id_post,
      c.id_wall AS id_wall,
      p.id_users AS user_id,
      u.username AS username 
    FROM
      cronjobs c
      join (SELECT  MAX(id) id ,id_wall
          FROM cronjobs 
          GROUP BY id_wall) c1 on c.id = c1.id and c.id_wall = c1.id_wall
      join posts p on c.id_post = p.id 
      join users u on p.id_users = u.id 
    ORDER BY c.id
    

    DEMO

    【讨论】:

    • 如果on 子句包含多个条件,请考虑使用复合索引,而不是每个字段一个索引
    • @pala_ 是的,如果 where 子句条件包括多个列,则 where 子句需要复合索引
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多