MySQL选择一行中的多行

时间:2015-07-28 07:47:24

标签: php mysql sql

我想要这样的东西,不确定我的语法是否正确。 我将用php执行此操作。

SELECT 
    a.column1,
    a.column2,
    b.column1,
    c.column1,
    IF a.column3 NOT NULL
        THEN (
            SELECT c.column1, c.column2, c.column3, d.column1
            FROM table_d d
            INNER JOIN table_c c
                ON d.column1 = c.column1 AND c.column4 = 1
            WHERE d.column2 = a.column3
        );
    END IF;

FROM table_a a

    INNER JOIN table_b b
        ON a.column1 = b.column1 AND b.column2 = 1

    INNER JOIN table_c c
        ON a.column1 = c.column1 AND c.column2 = 1

WHERE
    a.column1 = 1000
    AND b.column3 = 1
    AND c.column3 = 0

ORDER BY 
        a.column1 ASC

所以输出将是这样的:

如果它在前几列上有多个具有相同数据的行,那就没问题了。像这样:

灰色区域来自外部SELECT ,白色区域来自内部SELECT

请注意,外部和内部select语句都有table_c。如果没有IF声明,我可以这样做吗?

SELECT 
    a.column1,
    a.column2,
    b.column1,
    c.column1,
    cc.column1,
    cc.column2,
    cc.column3,
    d.column1   

FROM table_a a

    INNER JOIN table_b b
        ON a.column1 = b.column1 AND b.column2 = 1

    INNER JOIN table_c c
        ON a.column1 = c.column1 AND c.column2 = 1

    LEFT JOIN table_d d
        ON  a.column3 = d.column2

    INNER JOIN table_c cc
        ON d.column1 = cc.column1 AND cc.column4 = 1

WHERE
    a.column1 = 1000
    AND b.column3 = 1
    AND c.column3 = 0

ORDER BY 
        a.column1 ASC

我觉得有点不对劲。 如果我使用fetch_assoc怎么办? 甚至可以在一个查询中执行此操作吗?

3 个答案:

答案 0 :(得分:1)

尝试这样的事情:

SELECT 
    a.column1,
    a.column2,
    b.column1,
    c.column1,
    IF (a.column3 NOT NULL,c_2.column1,''),
    IF (a.column3 NOT NULL,c_2.column2,''),
    IF (a.column3 NOT NULL,c_2.column3,''),
    IF (a.column3 NOT NULL,d.column4,'')

FROM table_a a

    INNER JOIN table_b b
        ON a.column1 = b.column1 AND b.column2 = 1

    INNER JOIN table_c c
        ON a.column1 = c.column1 AND c.column2 = 1

    INNER JOIN table_c as c_2
        ON d.column1 = c.column1 AND c.column4 = 1

    INNER JOIN table_d 
        ON a.column1 = c.column1 AND c.column2 = 1
WHERE
    a.column1 = 1000
    AND b.column3 = 1
    AND c.column3 = 0
ORDER BY 
        a.column1 ASC

答案 1 :(得分:0)

要使用fetch_assoc,您需要使用别名,否则您只能通过索引来获取它们。除此之外,它应该有效。

答案 2 :(得分:0)

  

如果a.column3 NOT NULL       THEN

这就是“内部联接”的用途。根据定义,内部真正意味着“只有匹配”。或者,您可以使用左外连接,然后使用“where”以确保不包含此位置中具有NULL的记录。内部联接将过滤掉匹配字段中具有空值的任何记录(即:否匹配=排除此记录)。

如果你想要所有记录,但是如果链接表没有记录那么你想要在这些字段中显示空白......那就是左外连接的用途。再一次,这实际上是定义。 8 - )

如果你通过fetch_assoc引用PHP函数,你应该考虑切换到mysqli而不是mysql,它允许更容易获得的“索引或名称”字段关联。但无论如何,内部联接可以消除使用“as XXXX”字段名称别名的需要。