优化SQL查询以获取文件名

时间:2016-11-20 08:43:14

标签: php sql-server database

我有两个表,第一个表包含有关用户提交的想法的信息,第二个表包含有关该想法的文件附件的信息。用户提交的想法可以包含0个或任意数量的附件。

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是表2中映射到表1 Id的外键。

我试图在html页面中显示所有想法及其附件。所以我一直在做的是:从表1中获取所有想法,然后为每个创意记录,从表2中检索附件记录。这似乎是非常低效的。这可以优化,以便我可以在一个查询中检索想法记录及其相应的附件记录吗?

我尝试使用左外连接(表1 左外连接表2),但这会在表1中为我提供三条Id = 1的记录。我正在寻找SQL查询将俱乐部创意细节和附件名称分成一行,以提高HTML页面处理效率。否则,最好的解决方案是什么?

2 个答案:

答案 0 :(得分:-1)

如果您想获得所有附件以及所有想法,可以使用GROUP_CONCAT。比如

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

答案 1 :(得分:-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                    |
+----+----------------+-----------+-----------------+------+---------+------------------------------+