繁体   English   中英

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

[英]Select from two tables where rows from second table should be shown as columns in first

我在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_idnote是一个外键identry

我可以使用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可以找到的名称来获取所有不同的注释,然后通过PHP使用foreach构建一个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'

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

不,没有联接就没有办法。

我建议做2个查询。

  1. 从id = id条目中选择*
  2. 从注释中选择*,其中entry_id = id

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

最好的方法是使用每行一个注释值和一个注释类型(数字)的表。

id | 价值| note_no

这样,您可以使用任意数量的注释。

您可以使用group_concat在一行上获取注释。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM