2

私は2つのテーブルを持っていてSchoolsUsers

テーブルスクール

-----------------------------------------------------
| id |     name    |  city  |     major    | userID |
----------------------------------------------------|
| 1  |  school A   | chicago |    CS       |    1   |
----------------------------------------------------|
| 2  |  school B   | chicago |    CS       |    1   |
----------------------------------------------------|
| 3  |  school A   | chicago |    CS       |    2   |
----------------------------------------------------|
| 4  |  school C   | chicago |    Art      |    2   |
----------------------------------------------------|
| 5  |  school B   | chicago |    CS       |    3   |
----------------------------------------------------|
| 6  |  school D   | chicago |    Math     |    3   |
----------------------------------------------------|
| 7  |  school A   |New York |    CS       |    3   |
----------------------------------------------------|
| 8  |  school B   | chicago |    Art      |    3   |
-----------------------------------------------------

テーブル ユーザー

--------------------
| id |     name    |
____________________
| 1  |    User A   |
____________________
| 2  |    User B   |
____________________
| 3  |    User C   |
____________________
| 4  |    User D   |
____________________
| 5  |    User E   |
____________________

テーブル内のuserIDフィールドは、テーブル内のフィールドschoolsへの外部キーです。指定された を取り、そのユーザーのすべてのクラスメートをリストする MySQL ステートメントを書きたいと思います。idusersuserID

したがって、上記の例では、 User A(ID#1) のクラスメートは、 と同じ学校に通い、同じUser Aに所在し、同じcityを持っているユーザーですmajor。したがって、有効なクラスメートUser AUser B(ID#2) AND User C(ID#3) のみです。

現在、この目標を達成するために 2 つの MySQL ステートメントを使用しています。一枚目はこれ

SELECT id FROM schools WHERE userID = '1'

のすべての学校を一覧表示しますUser A。次に、PHP を使用して結果をループ処理し、行ごとに次を実行します。

    SELECT userID from schools WHERE 
name city LIKE '%$chicago%' 
AND name LIKE '%$school A%' 
AND major LIKE '%$CS%'

これは正常に機能し、ユーザー ID の正しいリストを返します。ただし、PHP を使用せずに 1 つの SQL ステートメントでこれを行うより効率的な方法があるかどうか疑問に思っています。

4

2 に答える 2

2

次のように実行できます。

select distinct u.name
from Users u
join School s on s.userID = u.id
join (
            select distinct s.name, s.city
            from School s
            inner join Users u on u.id = s.userID
            where u.name = 'User A'
           ) aux on s.name = aux.name and s.city = aux.city
where u.name <> 'User A'

auxクエリでは、 のnameとを選択してから、それらの要件をすべて選択し、それ自体ではありません。city@userusers@user

「ユーザー A」を変数に置き換えることができます。

于 2012-07-06T16:04:12.677 に答える
-2

あなたの SCHOOL テーブルは正しくないと見なされます。リレーショナル データベース管理システムの規則に違反しています。

さらに 3 つのテーブルを作成する必要があります。1 つは学校名用、もう 1 つは都市名用、3 つ目は専攻名用です。これらはすべて、ID を持つ異なるテーブルでなければなりません。

name 列と city 列は明らかに多対多の関係にあるため、このためのルックアップ テーブルを作成する必要があります。

同じことが主要な列にも当てはまります。たくさんのテーブルのように見えますが、値の抽出は簡単です。

OK、テーブルにいくつかの変更を加えました。私はこの方法でデータを保存することを好みます:

table student
col.
id 
name
major
reg.no.   (to make each student unique)

table school
col.
id 
name

table city
col.
id 
name

table student_school (lookup table)
col.
student_id
school_id

table school_city
col.
school_id
city_id

これらのテーブルを優先すると、すべてのクエリを簡単に作成できることがわかります。これを理解するのに問題がある場合は、お知らせください。

于 2012-07-06T16:21:39.517 に答える