在mysql表中查找最后一篇帖子的用户名,加入3个表

时间:2015-05-14 05:50:05

标签: php mysql sql database

我知道我正在做这个qry错误 - 它取得了10秒的结果回来w /只有3000行数据...... 我有3张桌子:
用户
ID
用户名

DATA:
1|tom
2|dick
3|harry



帖子
ID
id_users

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

cronjobs
ID
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是自动增量。 我需要在每面墙上获取用户名和最后一篇文章。 在上面的例子中

迪克是最后一个以4号位发布在第4号墙上的人 哈利是最后一个用帖子6发布在墙3上的人 汤姆是最后一个在5号墙上张贴帖子2的人 汤姆是最后一个用帖子1发布在2号墙上的人 汤姆是最后一个在帖子1上张贴帖子1的人

这是qry我目前正在使用,我知道使用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 

感谢任何帮助!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以在where子句中使用join而不是子查询,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