0

MySQL クエリで部分的に重複する結果を回避しようとして問題が発生しています。私はMySQLに本当に慣れていないことを認めますが、SOに関する調査から、以下でレイアウトしようとしているスキーマは間違いなくより良い方法で実行できることを学びました(usersテーブルのlinked_users列は別のテーブルにする必要があります) )。ただし、今の設定方法を変更することはできません。

t2 の各アイテムに割り当てられたユーザー ID のユーザー名、またはそれらのユーザーにリンクされているユーザーのユーザー名を返そうとしています。ただし、クエリはアイテムごとに 2 セットの名前を返します。複数のテーブルから複数の値を返すことに関して SO に関するこのチュートリアルを読み込もうとしましたが、JOINS や UNIONS などについて頭を悩ませているようには見えません。

私の質問は 2 つあります。

  1. データベースのセットアップ方法を変更せずにこの問題を解決するにはどうすればよいですか?
  2. 今後、このようなクエリをより適切に実行できるようにするには、データベースをどのように変更する必要がありますか?

お時間をいただきありがとうございます。

スキーマ:

create table users (user_id int, user_name varchar (55), linked_users varchar (55));
insert into users( user_id, user_name, linked_users)values(1, 'user1', '2,154,4,45');
insert into users( user_id, user_name, linked_users)values(2, 'user2', '13,1,200');
create table t2 (t2_id int, user_id int);
insert into t2( t2_id, user_id)values(1, 2);
insert into t2( t2_id, user_id)values(2, 1);
insert into t2( t2_id, user_id)values(3, 1);
insert into t2( t2_id, user_id)values(4, 2);
insert into t2( t2_id, user_id)values(5, 3);

クエリ:

SELECT t.*, u.user_name 
FROM t2 t, users u 
WHERE t.user_id = u.user_id
OR find_in_set(t.user_id, u.linked_users) > 0

フィドル: http://sqlfiddle.com/#!9/c5540/10

4

3 に答える 3

1

Gordon と Tarik の回答に感謝します。フィドルで提供されたコードを試しましたが、t2 情報を取得できませんでした。

SELECT t2.*, u.user_name 
FROM users u, t2 t 
WHERE t.user_id = u.user_id 
AND (t.user_id = '$user_id' 
     OR t.user_id IN 
        (SELECT u2.user_id 
         FROM users u2 
         WHERE find_in_set('$user_id', u2.linked_users)
        )
    )

繰り返しますが、これが最適な方法ではないことは理解していますが、構造を変更できないため、これは目的を果たします。

于 2015-05-16T20:11:56.140 に答える