因此,如果我的选择中的结果与另一个 post_id 具有相同的 post_data_id ,那么我要做什么,删除该结果但显示其中一个。几天来,我一直在尝试使其正常工作,但惨遭失败。请检查我的 SQL Fiddle asweel 作为我的意思的截图
谢谢
可能有一种更简单的方法,但您可以使用:
SELECT p.*
FROM posts p
LEFT JOIN following f
ON f.user_id=1 AND p.post_user_id = f.follower_id
WHERE (post_user_id=1
OR f.follower_id IS NOT NULL)
AND (POST_DATA_ID NOT IN (SELECT POST_ID
FROM posts p
LEFT JOIN following f
ON f.user_id=1 AND p.post_user_id = f.follower_id
WHERE (post_user_id=1
OR f.follower_id IS NOT NULL))
OR POST_DATA_ID IS NULL)
ORDER BY `post_id` DESC;
你不能在一个语句中真正地删除和选择。您将始终需要连续执行两条语句。
我不确定您要删除哪些行(重复的 post_id 或重复的 post_data_id),但您需要以下四个语句中的两个:
SELECT * FROM posts WHERE post_data_id IN (
SELECT post_id FROM posts);
SELECT * FROM posts WHERE post_id IN (
SELECT post_data_id FROM posts);
DELETE FROM posts WHERE post_data_id IN (
SELECT post_id FROM posts);
DELETE FROM posts WHERE post_id IN (
SELECT post_data_id FROM posts);
您可以使用 NOT EXISTS 并选择返回到同一个表:
使用小提琴中的查询:
SELECT
p.*
FROM
posts p
LEFT JOIN following f
ON f.user_id=1 AND p.post_user_id = f.follower_id
WHERE
(post_user_id=1
OR f.follower_id IS NOT NULL)
and not exists (select 'x'
from posts posts_2
where p.post_data_id = posts_2.post_id)
ORDER BY `post_id` DESC
尝试这个。我添加了一个group by
forpost_id
因为您希望该列是唯一的。我假设post_type
如果 s 相同,则 etc 列值保证post_id
相同,因此您可以使用某些函数安全地聚合它们,例如MAX
.
SELECT p.post_id, MAX(p.post_type), MAX(p.post_user_id), MAX(p.post_data_id)
FROM posts p
LEFT JOIN following f
ON f.user_id=1 AND p.post_user_id = f.follower_id
WHERE (post_user_id=1
OR f.follower_id IS NOT NULL)
GROUP BY p.post_id
ORDER BY `post_id` DESC;
这个查询有很多问题,但我认为这个概念可能有潜力:
SELECT -- p.*
GROUP_CONCAT(post_id) AS POST_IDs,
GROUP_CONCAT(post_type) AS POST_TYPEs,
GROUP_CONCAT(post_user_id) AS POST_USER_IDs,
GROUP_CONCAT(post_data_id) AS POST_DATA_IDs
FROM posts p
LEFT JOIN following f
ON p.post_user_id = f.follower_id
WHERE 1 IN (p.post_user_id, f.user_id)
GROUP BY LEAST(POST_ID,COALESCE(POST_DATA_ID, POST_ID))
ORDER BY post_id DESC;
主要问题是知道在给定行中使用哪个 POST_ID 或 POST_TYPE 或 POST_USER_ID。
这是获取指定结果的一种方法,将原始查询用作内联视图。(实际上,该查询引用了您的原始查询两次。我从原始查询中删除了 ORDER BY。它不需要被删除,但它也没有必要在那里。
SELECT a.*
FROM (
SELECT p.*
FROM posts p
LEFT JOIN following f
ON f.user_id=1 AND p.post_user_id = f.follower_id
WHERE (post_user_id=1
OR f.follower_id IS NOT NULL)
) a
LEFT
JOIN (
SELECT p.*
FROM posts p
LEFT JOIN following f
ON f.user_id=1 AND p.post_user_id = f.follower_id
WHERE (post_user_id=1
OR f.follower_id IS NOT NULL)
) b
ON b.post_id = a.post_data_id
WHERE b.post_id IS NULL
ORDER BY a.post_id DESC;
可能有更有效的方法可以获得相同的结果,但是这个查询满足要求。它使用经典的 angi-join 模式:aLEFT [OUTER] JOIN
查找匹配的行,并在WHERE
子句中使用谓词来消除匹配的行。
例如,从 p 中获取 q 中没有匹配行的行
SELECT p.*
FROM p
LEFT
JOIN q
ON q.id = p.q_id
WHERE q.id IS NULL
SELECT p.*
FROM posts p
LEFT JOIN following f
ON f.user_id=1 AND p.post_user_id = f.follower_id
LEFT JOIN post x
ON p.post_data_id=x.post_id
WHERE (p.post_user_id=1
OR f.follower_id IS NOT NULL)
AND x.post_id is null
ORDER BY p.post_id DESC;