0

我在 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_idin是innote的外键。identry

有没有我可以创建的任何解决方案,SELECT它会给我如下结果?

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

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

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'

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

4

2 回答 2

1

不,没有连接就没有办法做到这一点。

我建议做 2 个查询。

  1. 从 id = 的条目中选择 *id
  2. select * from note where entry_id =id

然后将结果加入您的应用程序代码中。你是对的,左连接会很糟糕。

于 2013-05-02T18:47:38.893 回答
0

最好的办法是使用一个表,每行有一个音符值和一个音符类型(编号)。

编号 | 价值 | note_no

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

您可以使用group_concat.

例如,请参见此处: http: //lietoservetruth.wordpress.com/2010/12/13/mysql-group_concat-vertival-concat-concat-records/

这比两次询问数据库要快,而且是更好的数据库设计......

于 2013-05-02T18:50:32.373 回答