Actually I’m working with WordPress. I want to create a self-join or something similar to find a revision of a post, and the following revision of the same post.
x
create table wp_posts (post_id int, revision_id int);
INSERT INTO wp_posts(post_id, revision_id) VALUES (1, 1);
INSERT INTO wp_posts(post_id, revision_id) VALUES (1, 2);
INSERT INTO wp_posts(post_id, revision_id) VALUES (1, 3);
INSERT INTO wp_posts(post_id, revision_id) VALUES (2, 11);
INSERT INTO wp_posts(post_id, revision_id) VALUES (2, 12);
INSERT INTO wp_posts(post_id, revision_id) VALUES (2, 13);
SELECT a.post_id, a.revision_id "PreviousRevision", b.revision_id "FollowingRevision"
FROM `wp_posts` a
JOIN `wp_posts` b
ON a.post_id = b.post_id #the id of every revision of a post is different but the post_id is the same
WHERE a.revision_id < b.revision_id
AND a.revision_id != b.revision_id
https://www.db-fiddle.com/f/eHnwYABYrVVQAhn8xLJ77q/1
The previous query doesn’t work since it takes, for every record of a, all the revision which have been made and not just the next one.
This is what I get, and I’ve striked out the lines I don’t want. I need only father-child rows.
How can I take just one element?
Advertisement
Answer
For this sample data you need the maximum a.revision_id
for each combination of a.post_id, b.revision_id
:
SELECT
a.post_id,
MAX(a.revision_id) "PreviousRevision",
b.revision_id "FollowingRevision"
FROM `wp_posts` a JOIN `wp_posts` b
ON a.post_id = b.post_id
WHERE a.revision_id < b.revision_id
GROUP BY a.post_id, b.revision_id
Also the condition a.revision_id != b.revision_id
is not necessary beacause you already have a.revision_id < b.revision_id
.
See the demo.
Results:
| post_id | PreviousRevision | FollowingRevision |
| ------- | ---------------- | ----------------- |
| 1 | 1 | 2 |
| 1 | 2 | 3 |
| 2 | 11 | 12 |
| 2 | 12 | 13 |