【问题标题】:mysql filtering results with subquery resultsmysql过滤结果与子查询结果
【发布时间】:2014-12-15 00:12:42
【问题描述】:

我有两张桌子:

标题

  • 身份证
  • 标题

条目

  • 身份证
  • 条目
  • title_id
  • user_id
  • 时间(时间戳)

我需要检查我在该标题的最后一个条目之后是否提交了任何新条目。寻找过滤每个标题上的更新(不同于我的 user_id)的查询,并列出结果,其中包含一个显示新条目的数字。


示例

标题

id | title

1 | Cars
2 | Computers

条目

id | entry    | title_id | user_id | time
1  | bmw      | 1        | 1       | 1418595811
2  | mercedes | 2        | 2       | 1418595812
3  | ibm      | 2        | 2       | 1418595813
4  | hp       | 2        | 3       | 1418595814
5  | dell     | 2        | 1       | 1418595815
6  | acer     | 2        | 3       | 1418595816
7  | asus     | 2        | 4       | 1418595817
8  | toshiba  | 2        | 4       | 1418595818
9  | ferrari  | 1        | 3       | 1418595819
10 | toyota   | 1        | 4       | 1418595820
11 | honda    | 1        | 2       | 1418595821

预期结果:

如果 user_id=1 ->

Cars (3)
Computers (3)

如果 user_id=2 ->

Cars (0)
Computers (5)

如果 user_id=3 ->

Cars (2)
Computers (2)

如上所示,[user_id=1] 提交了一辆汽车 (bmw)。之后,其他用户提交了该标题的条目。在用户上次提交后,我需要查询每个标题的新提交。 (使用时间字段) 唯一需要的是是否有新的提交。如果有,有多少?

我需要这样的东西:

select count(entry) 
from entry where time>last_entry_time[user_id] 
left join titles 
where title.id=entry.title_id

【问题讨论】:

  • 您的问题不是很清楚,您能否添加一些示例数据和所需的结果。如果你也可以制作一个 sqlfiddle,那就太好了。
  • 只是举个例子
  • 为什么user_id = 3只有一台电脑?他提交hp后,用户1提交dell,用户4提交asus和toshiba,所以应该是3。
  • 为什么Cars (4)user_id = 1?之后进入的唯一汽车是最后 3 行。
  • 我在关于用户 3 的问题中犯了一个错误,我使用的是他的第一个条目,而不是最后一个条目。但还是应该是2台电脑,因为用户4提交了华硕和东芝。

标签: php mysql filter subquery


【解决方案1】:

这适用于所有用户:

SELECT e1.user_id, t.title, COUNT(e2.id) AS count
FROM titles AS t
LEFT JOIN (SELECT user_id, title_id, MAX(time) AS last_entry
           FROM entry
           GROUP BY user_id, title_id) AS e1
ON t.id = e1.title_id
LEFT JOIN entry AS e2 ON e2.title_id = e1.title_id AND e2.user_id != e1.user_id AND e2.time > e1.last_entry
GROUP BY e1.user_id, t.id
ORDER BY e1.user_id, t.title

DEMO

为特定用户执行此操作:

SET @user_id = 1;

SELECT t.title, COUNT(e2.id) AS count
FROM titles AS t
LEFT JOIN (SELECT user_id, title_id, MAX(time) AS last_entry
           FROM entry
           WHERE user_id = @user_id
           GROUP BY title_id) AS e1
ON t.id = e1.title_id
LEFT JOIN entry AS e2 ON e2.title_id = e1.title_id AND e2.user_id != @user_id AND e2.time > e1.last_entry
GROUP BY t.id
ORDER BY t.title

DEMO

【讨论】:

  • 抱歉我的计数错误。方法是正确的,但您的查询中没有变量。我们需要过滤每个 user_id 的结果。 (它是一个会话变量)所以查询中应该有一个“where user_id='$_SESSSION["user_id"]”。
  • 我已经添加了单用户版本。
  • 如果您不想列出零计数,请将LEFT JOIN 更改为INNER JOIN
【解决方案2】:

我不确定我是否正确地遵循了您的问题。试试这个

select e.id, e.tittle_id, e.user_id from entry e 
       where e.id not in(
                        select e.id from entry e, titles t where t.id = e.id
                        )

【讨论】:

  • 这不是我需要的解决方案。请检查我给出的示例。
猜你喜欢
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 2012-04-20
  • 2019-12-29
  • 1970-01-01
相关资源
最近更新 更多