选择除最高记录外的所有记录
Posted
技术标签:
【中文标题】选择除最高记录外的所有记录【英文标题】:SELECT all records but the highest 【发布时间】:2013-11-24 17:52:53 【问题描述】:我有三张桌子。
Page Revision Text
+-----------+-------------+ +-----------+-------------+----------+ +-------------+---------+
| page_id | rev_id | | rev _id | rev_text_id | page_id | | rev_text_id | text |
+-----------+-------------+ +-----------+-------------+----------+ +-------------+---------+
| 1 | 2 | | 1 | 1 | 1 | | 1 | A |
+-------------------------- +------------------------------------+ +-----------------------+
| 2 | 5 | | 2 | 2 | 1 | | 2 | B |
+-------------------------+ +------------------------------------+ +-----------------------+
| 3 | 3 | 2 | | 3 | C |
+------------------------------------+ +-----------------------+
| 4 | 4 | 2 | | 4 | D |
+------------------------------------+ +-----------------------+
| 5 | 4 | 2 |
+------------------------------------+
我想要的输出是:
+--------+-------------+
| rev_id | rev_text_id |
+--------+-------------+
| 1 | 1 |
+----------------------+
| 3 | 3 |
+----------------------+
| 4 | |
+----------------------+
我的目标是找到可以在单个查询中从每个表中删除的 rev_id 和 rev_text_id。由于修订表可以为多个修订保留相同的 rev_text_id,因此我需要排除每个页面的最高 rev_text_id(在示例 4 中为第 2 页)。
我开始涉足:
SELECT
r.rev_id,r.rev_text_id
FROM revision r, page p, text t
WHERE p.page_id = r.page_id
AND t.rev_text_id = r.rev_text_id
AND p.rev_id != r.rev_id
AND r.rev_text_id not in (
SELECT max(r.rev_text_id)
FROM revision AS r, page AS p
WHERE r.rev_id = p.rev_id
);
但这会在我想要的输出中跳过 rev_id 4 的记录,并且不包括“空案例”..
【问题讨论】:
请显示当前的 SQL 查询 考虑提供一个相同的 sqlfiddle,为了大家的理智,考虑将列重命名为rev_id
、page_id
和 rev_text_id
。
【参考方案1】:
试试这个:
SELECT r.`rev_id`, r.`rev_text_id`
FROM `Revision` AS r
WHERE r.`rev_text_id` NOT IN (SELECT r.`rev_text_id`
FROM `Revision` AS r, `Page` AS p
WHERE r.`rev_id` = p.`page_latest`;)
ORDER BY r.`rev_id`;
这基本上是抓取等于 page_latest 的 rev_id,找到与那些 rev_id 相关联的 rev_text_id,并使用那些 rev_text_id 作为过滤器。
【讨论】:
该查询没有正确返回 rev_id 4,因为您过滤掉了那些与 page_latest 具有相同 rev_id 的修订。我想要的输出包括 rev_id 4 没有附加在输出中的 rev_text_id。我想这必须使用连接来获得? 我不知道是否有办法在纯 SQL 中做到这一点。我不知道有一种方法可以像这样将单元格分开。您可能必须在查询后在 php 中处理它。以上是关于选择除最高记录外的所有记录的主要内容,如果未能解决你的问题,请参考以下文章
android java 正则表达式匹配除一个字符外的所有字符