mysql - 选择除最高记录以外的所有记录

标签 mysql sql select join mediawiki

我有三个表。

 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(在第 2 页的示例 4 中)。

我开始涉足以下方面:

 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 的记录,并且不包括“空案例”..

最佳答案

试试这个:

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 作为过滤器。

关于mysql - 选择除最高记录以外的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19931601/

相关文章:

sql - 合并 1 :M tables with removing duplicate fields

select - SQLPLUS 值问题

sql - 从 Oracle 的 Select (not Distinct) 中的第一列中删除重复项

mysql - 创建表-Mysql

php - 组数据库记录并回显组名称及其记录

mysql - 在 MySQL 中更改数据库变量 "character_set_client"

php - 动态 Eloquent 查询注入(inject)在 Laravel 中不起作用

mysql - 如何使用group by拥有父子字段

sql - Oracle MERGE 语句在并行事务中执行 : How to prevent duplicate keys?

AngularJS ng-repeat 设置默认选择值