2015-07-28 104 views
9

我想要這樣的東西,不知道我的語法是否正確。 我將用php執行此操作。MySQL在一行內選擇多行

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會怎麼樣? 它甚至有可能在一個查詢中做到這一點?

+0

可以。您將需要一些別名來避免通過索引獲取它們。 'c.column1 AS c_col1'中的別名爲 – Vatev

+0

?喜歡這個?所以如果我這樣做第二個代碼段將工作? – yukari

+3

無論你需要別名,它都可以工作,所以你可以使用'fetch_assoc'來獲得所有的字段。 – Vatev

回答

0

要使用FETCH_ASSOC,你將需要使用別名,否則你就只能通過指數來接他們,真的。除此之外,它應該工作。

0

IF a.column3 NOT NULL THEN

這是 「內部連接」 是。根據定義,內在的真正意思是「只有在有匹配的情況下」。或者,您可以使用左外連接,然後使用「where」來確保沒有包含此位置具有NULL的記錄。 Inner Join將過濾出匹配字段中有空的任何記錄(即:NO匹配=排除此記錄)。

如果你希望所有的記錄,但要在這些領域的空白,如果鏈接表中沒有記錄......這就是左外連接是。這又是一個定義。 8-)

如果你指的是一個PHP函數FETCH_ASSOC,您應該考慮切換到庫MySQLi而不是MySQL的,它允許更容易獲得「索引或名稱」字段關聯。但無論如何,內部聯接可以消除使用「as XXXX」字段名稱別名的需要。

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