1

因此,如果我的选择中的结果与另一个 post_id 具有相同的 post_data_id ,那么我要做什么,删除该结果但显示其中一个。几天来,我一直在尝试使其正常工作,但惨遭失败。请检查我的 SQL Fiddle asweel 作为我的意思的截图

查看SQLFiddle SQLFiddle 截图

谢谢

4

7 回答 7

4

可能有一种更简单的方法,但您可以使用:

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;

SQL小提琴

于 2013-08-13T19:09:23.097 回答
1

你不能在一个语句中真正地删除和选择。您将始终需要连续执行两条语句。

我不确定您要删除哪些行(重复的 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);
于 2013-08-13T19:13:03.493 回答
0

您可以使用 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
于 2013-08-13T19:10:04.053 回答
0

尝试这个。我添加了一个group byforpost_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;
于 2013-08-13T19:25:54.687 回答
0

这个查询有很多问题,但我认为这个概念可能有潜力:

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。

于 2013-08-13T19:56:40.220 回答
0

这是获取指定结果的一种方法,将原始查询用作内联视图。(实际上,该查询引用了您的原始查询两次。我从原始查询中删除了 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
于 2013-08-13T19:57:21.347 回答
-1
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;
于 2013-08-13T19:11:27.923 回答