3

私は非常に基本的な問題で立ち往生しています.3つの列に重複する値を持つ行をスキップしたい.

テーブル フィード

id,type,user_id,friend_id,date
1, 'friend', 4 , 5 , 5/5/2010
2, 'friend', 5 , 4 , 5/5/2010

これがデータの保存方法です(保存モジュールを変更できません)

両方とも同じものを持っているので、2 行ではなく 1 行としてのみ選択したいのです。PHP の最後で検証して削除したくありません。b/c PHP で行う場合、ページネーションが邪魔になります。

編集:

テーブル構造

create table `feed` (
    `id` double ,
    `type` blob ,
    `user_id` double ,
    `type_id` double ,
    `date` datetime 
); 
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('78','friends','1314','1313','2012-09-03 19:48:14');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('79','friends','1313','1314','2012-09-03 19:48:14');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('80','friends','1314','1312','2012-09-03 19:49:07');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('82','friends','1313','1312','2012-09-03 19:49:09');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('84','friends','1315','1312','2012-09-03 19:49:24');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('86','friends','1315','1313','2012-09-03 19:49:33');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('87','friends','1313','1315','2012-09-03 19:49:33');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('97','friends','1317','1312','2012-09-03 19:55:06');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('99','friends','1313','1317','2012-09-03 19:56:01');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('100','friends','1317','1313','2012-09-03 19:56:01');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('101','friends','1315','1317','2012-09-03 19:56:58');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('102','friends','1317','1315','2012-09-03 19:56:58');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('104','following','1313','1193','2012-09-03 19:59:39');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('105','following','1313','1308','2012-09-03 19:59:51');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('106','following','1313','1098','2012-09-03 19:59:58');
4

4 に答える 4

1

そしてここに究極の解決策があります!同じフレンドシップ ペア (逆) が存在する場合、user_id>friend_id のペアのみが取得されます。

SELECT DISTINCT type, user_id, friend_id, date 
FROM table t1 
WHERE t1.user_id > t1.friend_id 
    OR NOT EXISTS (
        SELECT * FROM table t2 
            WHERE t1.type=t2.type AND t1.date=t2.date 
            AND t2.user_id = t1.friend_id AND t2.friend_id = t1.user_id 
    )
于 2012-09-20T21:26:20.487 に答える
1

探している関数は DISTINCT() です。これにより、その列でテーブルをグループ化し、重複を削除できます。

select ステートメントで、他のフィールド列も選択していることを確認してください。

SELECT id, DISTINCT( type), user_id, friend_id, dateFROM テーブル名

于 2012-09-20T20:45:37.983 に答える
1

テーブル自体でaJOINを実行できます。これにより、探していることが実行されます。このような何かがトリックを行うかもしれません:

SELECT * FROM tableName a
JOIN tableName b ON a.user_id = b.friend_id
于 2012-09-20T20:51:03.640 に答える
0

次のコマンドを実行して、これらの重複レコードを削除する必要があります。

DELETE FROM table t1 WHERE
  EXISTS (
    SELECT * FROM table t2 
    WHERE t1.type=t2.type AND t1.date=t2.date 
      AND t2.user_id = t1.friend_id AND t2.friend_id = t1.user_id 
      AND t1.user_id > t2.user_id 
  )

次に、次の方法で個別の友情記録を取得できます。

SELECT DISTINCT type, user_id, friend_id, date FROM table

また、INSERT で起動する DB トリガーを記述して、(user_id と friend_id が逆になった) 重複が既に存在するかどうかを確認することもできます。存在する場合は ROLLBACK を実行し、存在しない場合は INSERT を許可します。

于 2012-09-20T21:20:03.107 に答える