2013-01-16 84 views
1

嗨,我想要做的是通過一個查詢從一個表中獲取一些客戶的詳細信息,並通過一個查詢獲取其他表中的所有項目。我的子查詢當前的問題是它將返回多於一行並導致錯誤。有沒有辦法解決這個問題,還是應該使用2個獨立的查詢?子查詢返回多於一行

我想在查詢中使用PDO fetchAll()來返回他們的名字和包含所有項目的子數組。

所以結果可以通過$ result ['First Name'],$ result ['First Name'],$ result ['product'] [0],$ result ['product'] [1] ,$結果[ '產品'] [3]等

當前聲明:

SELECT `First Name`, `Last Name`, 

(SELECT `items`.`Product Name` from items 
inner join customers on `customers`.`Customer No` = `items`.`Customer No` 
WHERE `customers`.`Customer No` = '6') 

AS product from customers where `Customer No` = '6' 
+1

添加一個LIMIT 1到子查詢中? – spencer7593

回答

1

我不認爲這是可能的一個行內返回一個數組,但你可以做的是使用group_concat在加盟值的字符串,然後你可以爆炸以後:

SELECT `customers`.`First Name`, `customers`.`Last Name`, 
GROUP_CONCAT(`items`.`Product Name` SEPARATOR '$^$') AS `Products` 
FROM customers 
JOIN items 
ON `customers`.`Customer No` = `items`.`Customer No` 
WHERE `customers`.`Customer No` = 6 
GROUP BY `Customer No` 

$products=explode("$^$",$result[0]['products']); 

group_concat的默認分隔符是,,使用爆炸時可能會非常危險,所以我們使用SEPARATOR '$^$'來添加一堆不太可能出現的隨機字符。

1

嘗試加入他們,

SELECT a.`First Name`, 
     a.`Last Name`, 
     b.`Product Name` 
FROM customers a 
     INNER JOIN items b 
      ON a.`Customer No` = b.`Customer No` 
WHERE a.`Customer No` = '6' 

這個查詢將返回只在有ATLEAST一個匹配customersitem由於聯接的類型定義爲:INNER JOIN。但是,如果你仍然想客戶的記錄,以顯示/檢索是否有匹配的值或者不表Items,改變INNER JOINLEFT JOIN外部聯接

要了解更多關於加入,請訪問文章下面,

0

我假設名字和姓氏的客戶表中columsn。我認爲這是更多你想要這個查詢:

選擇First NameLast Name,itemsProduct Name AS product FROM items INNER JOIN customers ON customersCustomer No = itemsCustomer No其中customersCustomer No = 6;

1

如果你想返回一行,你可以添加一個限制1.但我不認爲這就是你想要的,但。

如果你想返回與客戶相關的所有項目,您可以使用LEFT JOIN,類似這樣的:

SELECT c.`First Name` 
    , c.`Last Name` 
    , i.`Product Name` AS product 
    FROM customers c 
    LEFT 
    JOIN items i 
    ON i.`Customer No` = c.`Customer No` 
WHERE c.`Customer No` = '6' 

注:LEFT JOIN將返回所有行的客戶,與任何匹配的行沿項目。如果有一個客戶在項目故事中沒有任何行,則product列將爲NULL。如果您想要排除沒有任何物品的客戶(如果您不希望排到後面),請刪除LEFT關鍵字。 LEFT關鍵字的缺失等同於指定不必要的關鍵字INNER)。


要使用SELECT列表中的子查詢可以有效得到單列從客戶表背,只用一個相關的項目一起,然後你的方法。

但是您不需要在該子查詢中執行JOIN操作,您可以引用來自外部查詢的值(使其成爲相關的子查詢)。這裏的關鍵是爲子查詢添加一個LIMIT 1來確保它返回不超過1行。

SELECT `First Name` 
    , `Last Name` 
    , (SELECT `items`.`Product Name` 
      FROM `items` 
      WHERE `items`.`Customer No` = `customers`.`Customer No` 
      ORDER BY `items`.`Product Name` 
      LIMIT 1 
     ) AS product 
    FROM customers 
WHERE `Customer No` = '6' 

ORDER BY不是必需的,但它使結果集具有確定性。也就是說,如果缺少ORDER BY,MySQL可以自由地返回滿足謂詞的任何一行。隨後的運行可能會返回不同的結果。沒有什麼不對,但如果你不期待它可能會出乎意料。

+0

@wcgallego你確定''LEFT JOIN'(*或OUTER連接*)不使用索引嗎? –

+0

@wcgallego:你有這種行爲的參考嗎?因爲MySQL實際上有效地使用適當的索引來處理帶外連接的查詢。 – spencer7593

+0

試圖找到文件來支持自己。如果我找不到,我會刪除我的評論 – wcgallego