SQL中的INNER JOIN,其中一个表包含多个结果

时间:2015-04-30 08:15:16

标签: sql inner-join entity-attribute-value

我有两张桌子:

第一张表:

MEMBERS:
ID    |    FIRSTNAME    |    LASTNAME    |
1          Jack              Smith
2          Jane              Baker
3          Peter             Little

第二张表:

DETAILS:    
SUBSCRIBER_ID    |    FIELD_ID    |    FIELD_VALUE    |
1                     1                Blue
1                     2                Dogs
1                     3                March
2                     1                Pink
2                     2                Cats
2                     3                June
3                     1                Black
3                     2                Birds
3                     3                September

FIELD_ID表示成员的其他详细信息。即。

1 = Favorite color
2 = Favorite animal
3 = Favorite month

我想提交一份包含其主要信息的报告MEMBERS&来自DETAILS表的额外信息,其中SUBSCRIBER_ID =成员中的ID。所以对Jane来说,它看起来像是:

  • 贝克
  • 粉红色
  • 六月

更新:

我使用了以下SQL语句并且我提取了我想要的数据,但显示不是我想要的:

选择 成员。, 的信息。 来自会员INNER JOIN的详细信息 ON members.id = details.subscriber_id 在哪里jos_osmembership_subscribers.id =' 29'

(纯粹将记录记录缩减为一个成员)。

我得到的结果是:

Jane | Baker | Pink
Jane | Baker | Cats
Jane | Baker | June

我正在寻找

Jane | Baker | Pink | Cats | June

我使用以下输出,我知道100%错误:)

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "Results:" . $row["ID"] . "|";
        echo "" . $row["FIRSTNAME"] . "|";
        echo "" . $row["LASTNAME"] . "|";
        echo "" . $row["field_value"] . "|";
}

我真的在寻找能让我输出的东西:

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "Results:" . $row["ID"] . "|";
        echo "" . $row["FIRSTNAME"] . "|";
        echo "" . $row["LASTNAME"] . "|";
        echo "" . $row["color"] . "|";
        echo "" . $row["animal"] . "|";
        echo "" . $row["month"] . "|";
}

干杯

3 个答案:

答案 0 :(得分:1)

使用和INNER JOIN

SELECT ID, FIRSTNAME, LASTNAME, SUBSCRIBER_ID, FIELD_ID, FIELD_VALUE
FROM MEMBERS m
INNER JOIN DETAILS d ON m.ID = d.SUBSCRIBER_ID

答案 1 :(得分:0)

您使用的是哪个数据库?如果它将成为oracle,请尝试通过路径进行sys连接,以获得每人连续的所有三个细节 查询应该如下所示

SELECT id, 
       firstname, 
       lastname, 
       Sys_connect_by_path(field_value, ',') 
FROM   members m, 
       details d 
WHERE  m.id = d.subscriber_id 
START WITH id = 1 
CONNECT BY PRIOR subscriber_id = id 
ORDER  BY id 

答案 2 :(得分:0)

基本上,您至少有3个选项:

  1. 使用Matt建议的inner join,并处理表示层(在您的情况下为PHP)中数据的格式。
    这种方法的主要好处是它易于编写和维护,并且不需要对数据库进行任何更改。
  2. 创建一个将pivot您的详细信息表格的视图,并在该表格中使用inner join
    主要的好处是您只需选择所需的数据,并可以保留数据库设计。
  3. 更改数据库结构并将详细信息移至成员表中的列 这种方法的主要缺点是它需要更改数据库,但主要好处是一切都会变得更简单 如果您保留的详细信息易于更改(我的意思是,如果您想继续添加/删除每个成员的详细信息),请使用此选项。如果是这种情况,那么使用第一个选项,因为它是最简单的编写和维护。
  4. read about dynamic pivot in mysql

    read about when is it better to use EAV(实体 - 属性 - 值模型)