从两个表中选择,第二个表中的行应首先显示为列

时间:2013-05-02 18:43:38

标签: php sql join

我在MySQL中有两个表:

条目

id | name         | date
1  | Test Entry   | 12/12/2013
2  | Test Entry 2 | 12/12/2013

注意

id | entry_id | name  | value 
1  | 1        | note1 | value1
2  | 1        | note2 | value2
3  | 2        | note1 | value1
4  | 3        | note4 | value4

entry_id中的noteidentry的外键。

我是否可以使用SELECT创建任何可以获得如下结果的解决方案?

entry_id | name         | note1   | note2  | note3 
1        | Test Entry   | value1  | value2 |   -
2        | Test Entry 2 | value 1 |    -   | value3

我想在这里避免使用LEFT JOIN(当前的实现方式是这样的)并且如果可能的话,只想加入note一次。 LEFT JOIN在这里并不好,因为我不知道一个条目可以附加多少笔记。我当前的实现工作方式是我首先按名称查找所有不同的注释,可以在note中找到,然后使用foreach通过PHP构建一个SELECT。最后,SELECT语句如下所示:

SELECT 
E.id as entry_id,
E.name as name,
N1.value as note1_value,
N2.value as note2_value,
N3.value as note3_value
FROM entry E
JOIN LEFT note N1 ON E.id = N1.entry_id AND N1.name = 'note1'
JOIN LEFT note N2 ON E.id = N2.entry_id AND N2.name = 'note2'
JOIN LEFT note N3 ON E.id = N3.entry_id AND N3.name = 'note3'

当我加入note 20-30次时,事情变得棘手。

2 个答案:

答案 0 :(得分:1)

不,如果没有加入,就没有办法做到这一点。

我建议做2次查询。

  1. 从id = id
  2. 的条目中选择*
  3. 从note中选择*,其中entry_id = id
  4. 然后将结果加入您的应用程序代码中。你是对的,左连接会很糟糕。

答案 1 :(得分:0)

最好的方法是使用每个行有一个音符值和音符类型(数字)的表格。

id |价值| note_no

像这样,您可以使用尽可能多的笔记。

您可以使用group_concat在一行中获取备注。

有关示例,请参阅此处:http://lietoservetruth.wordpress.com/2010/12/13/mysql-group_concat-vertival-concat-concat-records/

这比询问DB两次更快,而且DB设计更好......