2016-08-26 5 views
1

EDIT:私のデータベースは正規化されていませんが、変更できません。MySQL:2人のユーザIDに関連する結果を取得する

user_dialogsというテーブルがあり、id, user_id, dialog_id, type, status, created_atupdated_atフィールドがあります。

user_id 1user_id 2の間に存在するdialog_idを取得する良い方法が見つかりませんでした。type='PRIVATE'です。

私はIN:user_id IN(1,2) and type='PRIVATE'を使用しようとしましたが、私はdialog_idというユーザー1がユーザー3で作成されています。

ユーザー1とユーザー2の間でdialog_idを取得する最適な方法は何ですか。

どのようにこの問題/アルゴリズムを呼び出すのですか?知りません。

ありがとうございます!

+0

できません。あなたのデータは、それを記述するときに正規化されていないので、その関係を記述する方法はありません。関係が__many-to-many__(_i.e。複数のユーザが同じダイアログに関与していて、複数のユーザがある)である 'user'と' dialog'の間の実際の関係を記述するテーブルが必要です。複数の対話に関わっている_)。これは、対話とユーザーの関係が__one-to-one __であることを示すときは不可能です。 – Sherif

+0

dialog_idは、会話中の2人(またはそれ以上)のユーザー間で一意ではありませんか? – scsimon

+0

ユーザはダイアログに1回だけ(ユーザによって一意)登録することができますが、ダイアログには多数のユーザを含めることができます。 – Maykonn

答えて

2

私は、dialog_idのユーザー1とユーザー2の間の共有が両方ともtype = 'PRIVATE'であることを確認したいと考えています。

一つの解決策は、「プライベート」、ユーザ1

SELECT ud.dialog_id 
FROM user_dialogs ud 
WHERE type='PRIVATE' 
AND user_id = 2 
AND ud.dialog_id IN (
    SELECT dialog_id 
    FROM user_dialogs 
    WHERE type='PRIVATE' 
    AND user_id = 1) 
+0

ありがとう!もし可能であれば、私はアップ議決権行使を助けます。 = D – Maykonn

0
SELECT 
    dialog_id 
    ,COUNT(DISTINCT user_id) as UserCount 
    ,COUNT(*) as OccurenceCount 
FROM 
    user_dialogs 
WHERE 
    user_id IN (1,2) 
    AND type = 'PRIVATE' 
GROUP BY 
    dialog_id 
HAVING 
    COUNT(DISTINCT user_id) > 1 
と共通である=タイプとユーザ2用dialog_id年代検索「PRIVATE」=タイプとユーザ1のためのすべてのdialog_id年代をサーチすることが
0

簡単に説明すると、このデータを3番目の正規形で記述する次のスキーマがあるとします。

CREATE TABLE user (id int); 
CREATE TABLE dialogue (id int); 
CREATE TABLE user_dialogue (user_id int, dialogue_id int); 

3つのテーブルがあります。 userdialogueおよびuser_dialogueテーブルであり、ユーザとダイアログの間の多対多の関係を表しています。

だから、あなたが説明するように、我々は3人のユーザー、および2つの対話を持っていることを考えると... 2人の特定のユーザーの間で生じdialgouesを​​抽出する

INSERT INTO user VALUES(1),(2),(3); 
INSERT INTO dialogue VALUES(1),(2); 
INSERT INTO user_dialogue VALUES(1,1),(2,1),(1,2),(3,2),(3,1); 

一つの方法は、私たちがJOINこのようなクエリを必要としますテーブルを自分自身に置き換え、GROUPによってuser_idを入力し、HAVING節を使用していずれかのidが存在する場合の結果のみを除外します。私たちの目的の結果セットを与える

SELECT d1.user_id, d1.dialogue_id 
    FROM user_dialogue d1 
    JOIN user_dialogue d2 ON d1.dialogue_id = d2.dialogue_id 
    GROUP BY d1.user_id; 
    HAVING user_id IN (1,2) 

...

 
|user_id | dialogue_id | 
------------------------ 
| 1  | 1   | 
| 2  | 1   | 

は今、あなたは、ユーザーとの対話の隣接リストを持っています。

関連する問題