0

クエリについてサポートが必要です。データベースに2つのテーブル、連絡先、タスクがあります。

mysql> describe contacts;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| contact_id | int(11)      | NO   | PRI | NULL    | auto_increment |
| last_name  | varchar(100) | YES  |     | NULL    |                |
| first_name | varchar(100) | YES  |     | NULL    |                |
| email      | varchar(50)  | YES  |     | NULL    |                |
| phone      | varchar(20)  | YES  |     | NULL    |                |
| school_id  | varchar(12)  | NO   |     | NULL    |                |
| access     | char(1)      | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

mysql> describe tasks;
+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| task_id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| task_name         | varchar(125) | YES  |     | NULL    |                |
| task_date         | date         | YES  |     | NULL    |                |
| task_description  | text         | YES  |     | NULL    |                |
| contact_id1       | int(11)      | YES  |     | NULL    |                |
| contact_id2       | int(11)      | YES  |     | NULL    |                |
| contact_id3       | int(11)      | YES  |     | NULL    |                |
| contact_id4       | int(11)      | YES  |     | NULL    |                |
| contact_id5       | int(11)      | YES  |     | NULL    |                |
| contact_id6       | int(11)      | YES  |     | NULL    |                |
| completed         | char(1)      | YES  |     | NULL    |                |
+-------------------+--------------+------+-----+---------+----------------+

タスクテーブルから情報を取得したいのですが、contact_id1-contact_id6を一致するcontact_idのいくつかのフィールドに置き換えたいと思います。私はネストされたselectステートメントをいじっていますが、これは機能しますが、非常に面倒です。これを行うには、もっとクリーンな方法が必要なようです。私はこれでいくつか持っていると思いました、

SELECT tasks.task_id, tasks.task_name, tasks.reminder_time, tasks.reminder_interval, CONCAT (contact_1.first_name, " ", contact_1.last_name) as contact_1_name, CONCAT(contact_2.first_name, contact_2.last_name) as contact_2_name, CONCAT(contact_3.first_name, contact_3.last_name) as contact_3_name
FROM tasks
JOIN contacts contact_1 ON tasks.contact_id1 = contact_1.contact_id
JOIN contacts contact_2 ON tasks.contact_id2 = contact_2.contact_id
JOIN contacts contact_3 ON tasks.contact_id3 = contact_3.contact_id

しかし、ここでの私の問題は、contact_id1-contact_id6の値のいずれかが0の値を持っているタスクを表示していないことです。これは、contact_idが設定されていない場合のデフォルト値です。

あなたが提供できるどんな助けも素晴らしいでしょう。

4

1 に答える 1

1

タスクテーブルを正規化するビューを作成すると、結合が簡単になります。永続的なビューを作成することも、選択したビューのみを作成することもできます。

ビューはUNIONである必要があります

SELECT task_id, task_name, task_description, contact_id1 as contact_id, completed from tasks
UNION ALL
SELECT task_id, task_name, task_description, contact_id2              , completed from tasks
UNION ALL
SELECT task_id, task_name, task_description, contact_id3              , completed from tasks
UNION ALL
SELECT task_id, task_name, task_description, contact_id4              , completed from tasks
UNION ALL
SELECT task_id, task_name, task_description, contact_id5              , completed from tasks
UNION ALL
SELECT task_id, task_name, task_description, contact_id6              , completed from tasks

それではこんな感じです

WITH tasks_easy as (    
    SELECT task_id, task_name, task_description, contact_id1 as contact_id, completed from tasks
    UNION
    SELECT task_id, task_name, task_description, contact_id2              , completed from tasks
    UNION
    SELECT task_id, task_name, task_description, contact_id3              , completed from tasks
    UNION
    SELECT task_id, task_name, task_description, contact_id4              , completed from tasks
    UNION
    SELECT task_id, task_name, task_description, contact_id5              , completed from tasks
    UNION
    SELECT task_id, task_name, task_description, contact_id6              , completed from tasks
 )
 select *
 from   tasks_easy t
 join   contacts c   on (t.contact_id = c.contact_id)

これをテストしていませんが、このように動作するはずです。

編集:実際にそれについて考えていました。UNION ALL、少なくとも一時ビューには必要ありません。テーブルが本当に大きい場合は、おそらく時間が改善されるでしょう。

于 2012-08-30T19:47:38.547 に答える