2016-11-20 5 views
0

私は2つのテーブルを持っています。最初のテーブルにはユーザが提出したアイデアに関する情報が含まれ、2番目のテーブルにはアイデアの一部です。ユーザーが提出したアイデアは、0個または任意の数の添付ファイルを持つことができます。ファイル名を取得するためにSQLクエリを最適化します

Table 1: 
------------------------------------- 
Id Title Content Originator 
------------------------------------- 
1 aaa bbb John 
2 ccc ddd Peter 

-------------------------------------- 

Table 2: 
--------------------------------------------- 
Id Idea_id Attachment_name 
--------------------------------------------- 
1 1 file1.doc 
2 1 file2.doc 
3 1 file3.doc 
4 2 user2.doc 
--------------------------------------------- 

表1主キーはIdであり、表2主キーもIdである。 Idea_idは、表1のIDへの表2の外部キーである。

私はすべてのアイデアを添付ファイルとともにHTMLページに表示しようとしています。私がしてきたことは、表1のすべてのアイデアを得てから、アイデアレコードごとにテーブル2から添付レコードを取得することです。これは非常に効率が悪いようです。これを最適化してアイデアレコードとそれに対応する添付レコードを1つのクエリで取得できるか?

私は左外部結合を試しました(表1 左外部結合表2)が、テーブル1のId = 1の3つのレコードを与えます。私はクラブのアイデアの詳細と添付ファイルへのSQLクエリを探していますHTMLページの処理を効率的にするために、1行に名前を付けます。それ以外の場合、これにはどのような最適な解決策がありますか?

+0

SQLは本当にあなたがレコードの固定数を持っていない場合には適していません。動的SQLを使用してn個のカラムを処理するものを構築するには、最初にどれくらいの数があるかを確認しますが、これはPHPで必要な構造を構築するのと比べて非常に複雑になります。 –

+0

カンマで区切ったリストなどでファイル名を使用する場合は、「xmlパスを使用して」使用を検索してください。 –

+0

この出力をしますか? http://stackoverflow.com/questions/15931607/convert-rows-to-columns-using-pivot-in-sql-server –

答えて

-1

すべてのアイデアとともにすべての添付ファイルを取得する場合は、GROUP_CONCATを使用できます。このよう

SELECT *, (SELECT GROUP_CONCAT(attachment_name separator ', ') FROM TABLE2 WHERE idea_id = TABLE1.id) attachments FROM TABLE1 
+0

これはMySQL用です。これはSQL Serverの質問です –

-1

ように私はおそらくポイントを逃したが、left joinすべてのレコードを戻す必要があります

create table `ideas` (
    `id` int(10) unsigned not null auto_increment, 
    `title` varchar(50) not null, 
    `content` varchar(50) not null, 
    `originator` varchar(50) not null, 
    primary key (`id`) 
) 
engine=innodb 
auto_increment=3; 

create table `attachments` (
    `id` int(10) unsigned not null auto_increment, 
    `idea_id` int(10) unsigned not null default '0', 
    `attachment` varchar(50) not null default '0', 
    primary key (`id`), 
    index `idea_id` (`idea_id`), 
    constraint `fk_ideas` foreign key (`idea_id`) references `ideas` (`id`) on update cascade on delete cascade 
) 
engine=innodb 
auto_increment=5; 



mysql> select * from ideas; 
+----+----------------+-----------+-----------------+ 
| id | title   | content | originator  | 
+----+----------------+-----------+-----------------+ 
| 1 | Flux capacitor | Rubbish | Doc    | 
| 2 | Star Drive  | Plutonium | Professor Frink | 
+----+----------------+-----------+-----------------+ 



mysql> select * from attachments; 
+----+---------+------------------------------+ 
| id | idea_id | attachment     | 
+----+---------+------------------------------+ 
| 1 |  1 | Flux capacitor schematic.jpg | 
| 2 |  1 | Sensors.docx     | 
| 3 |  1 | fuel.docx     | 
| 4 |  2 | plans.jpg     | 
+----+---------+------------------------------+ 


mysql> select * from ideas i 
    -> left outer join attachments a on a.idea_id=i.id; 
+----+----------------+-----------+-----------------+------+---------+------------------------------+ 
| id | title   | content | originator  | id | idea_id | attachment     | 
+----+----------------+-----------+-----------------+------+---------+------------------------------+ 
| 1 | Flux capacitor | Rubbish | Doc    | 1 |  1 | Flux capacitor schematic.jpg | 
| 1 | Flux capacitor | Rubbish | Doc    | 2 |  1 | Sensors.docx     | 
| 1 | Flux capacitor | Rubbish | Doc    | 3 |  1 | fuel.docx     | 
| 2 | Star Drive  | Plutonium | Professor Frink | 4 |  2 | plans.jpg     | 
+----+----------------+-----------+-----------------+------+---------+------------------------------+ 
関連する問題