2013-05-02 67 views
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_idnoteid的外键在entry

是否有任何解决方案,我可以创建一个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' 

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

+0

这将是我们更容易帮助你,如果你设置了[ SQL小提琴](http://sqlfiddle.com/) – 2013-05-02 18:43:54

+0

立即处理该问题。 – user1478283 2013-05-02 18:47:14

+0

JS小提琴网址:http://sqlfiddle.com/#!2/0b7ae/1 – user1478283 2013-05-02 18:54:33

回答

1

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

我会建议做2个查询。

  1. SELECT * FROM进入其中id = id
  2. SELECT * FROM记下entry_id = id

,然后加入在应用程序代码的结果。你是对的,左边的连接会变得很糟糕。

0

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

id |值| note_no

像这样,你可以使用尽可能多的笔记,只要你喜欢。

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

举一个例子,在这里看到:http://lietoservetruth.wordpress.com/2010/12/13/mysql-group_concat-vertival-concat-concat-records/

这比问DB快一倍,而且最好DB设计...

+0

事情是,我需要这些笔记名称为列,您可以打开和关闭那些你想要或不想看到的。 – user1478283 2013-05-02 18:55:42

+0

当使用'group_concat'时,你可以把所选择的字段放在一行... – rantanplan 2013-05-02 19:00:22

+0

是的,我知道关于group_concat,但我想是否有办法让他们在单独的列。 group_concat会将所有列值作为一个字符串返回给我。 – user1478283 2013-05-02 19:05:14

相关问题