2016-04-23 2 views
0

私はこれらのテーブルを持っている:ない直接

Customer = {id,firstname,last name,street,city} 
Invoice = {id, customerid, total} 
Item = {invoiceid, item, productid, quantity, cost} 
Product = {id, name, price} 

私は顧客の最初の名前と彼が買ったものを製品のリストを取得したいと思います。

私は、SQLコードを作成しました:

select customer.firstname, product.name from product 
inner join item on item.productid = product.id 
inner join invoice on invoice.id=item.invoiceid 
inner join customer on customer.id=invoice.customerid 
where customer.id=24 

このIDに、私は唯一の3項目の名前を取得する必要がありますのでcustomer.idは、24です。 残念ながら、私はこれらのアイテムの乗算を得ています。

私のクエリで何を修理すればよいですか?

答えて

0

これらの項目を乗算しています。

これは、参加依頼時にリレーショナルデータベースがどのように機能するかを示します。あなたは一致するレコードのCartesian Productを取得します。

しかし、MySQLは、単一のフィールドに複数の値を入れることができます施設があります - それはgroup_concatと呼ばれています:

SELECT 
    customer.firstname 
, GROUP_CONCAT(product.name SEPARATOR ', ') 
FROM product 
INNER JOIN item ON item.productid = product.id 
INNER JOIN invoice ON invoice.id=item.invoiceid 
INNER JOIN customer ON customer.id=invoice.customerid 
WHERE customer.id=24 
GROUP BY customer.id 

注に同じ顧客IDのすべての行を「マージ」GROUP BYの使用、単一のグループで、GROUP_CONCATが動作します。

+0

どのようにsqlでこの問題を解決するのですか?私は、SQLでgroup_concatを使用することはできません – Ganjira

+0

@ Ganjiraあなたは複数の行で生きる必要があります:結合はより多くの行を生成します。それらを1つの行にまとめることは、集計で可能です。カウントを行うが、リストを作るにはgroup_concatが必要です。 – dasblinkenlight