1

こんにちは、私がやろうとしているのは、あるテーブルから顧客の詳細を取得し、1 つのクエリで別のテーブルのすべてのアイテムを取得することです。サブクエリの現在の問題は、複数の行が返されてエラーが発生することです。これを回避する方法はありますか、それとも 2 つの別々のクエリを使用する必要がありますか?

クエリで PDO fetchAll() を使用して、名前と姓、およびすべてのアイテムを含むサブ配列を返したいと思います。

したがって、結果は $result['First Name']、$result['First Name']、$result['product'][0]、$result['product'][1]、$result[ でアクセスできます。 「製品」][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'
4

3 に答える 3

1

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は、explode,を使用するときに非常に危険な場合があるためSEPARATOR '$^$'、代わりに表示されない可能性のあるランダムな文字の束を追加するために使用します。

于 2013-01-24T18:13:43.690 に答える
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'

このクエリは、結合定義: のタイプにより、customersテーブルに少なくとも 1 つの一致があるもののみを返します。ただし、 table に一致する値があるかどうかを顧客のレコードで表示/取得する場合は、( OUTER 結合)に変更します。itemINNER JOINItemsINNER JOINLEFT JOIN

ジョインの詳細については、以下の記事をご覧ください。

于 2013-01-16T00:22:47.473 に答える
1

1行だけを返したい場合は、LIMIT 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、顧客からのすべての行と、アイテムからの一致する行を返します。items tale に行がない顧客がいる場合、product列は NULL になります。アイテムを持っていない顧客を除外する場合 (行を戻したくない場合) は、LEFTキーワードを削除します。キーワードがないことはLEFT、不要なキーワードを指定したことと同じですINNER)。


Customers テーブルから単一の行を、関連するアイテムを 1 つだけ取得するには、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 は述語を満たす行のいずれかを自由に返すことができます。その後の実行では、異なる結果が返される可能性があります。それは何も悪いことではありませんが、予期していなければ予期しないことになる可能性があります。

于 2013-01-16T00:23:50.890 に答える