2016-04-06 4 views
0

Tüm paketlerimi farklı satıcılardan almaya çalıştığım bu sorguya sahibim. Yapmak istediğim: her paketle, paketin ait olduğu satıcıya ait ortalama dereceyi yerleştirmek istiyorum. Yukarıdaki sorgu ileAVG işlevi kullanılıyorsa, SQL sorgusu sonucu tek bir sonuca kadar azalır

SELECT 
    p.id as package_id, 
    p.title as package_title, 
    p.path as package_image, 
    p.packageQuantity as package_quantity, 
    p.price as package_price, 
    AVG(r.star_rating) as star_rating 
FROM 
    package as p 
INNER JOIN vendor as v ON v.id = p.vendor_id 
INNER JOIN review as r ON r.vendor = v.id 

Sonuç:

Array 
(
    [0] => Array 
     (
      [package_id] => 3 
      [package_title] => Simple 
      [package_image] => 1f496761e41e3b23d014f5511d591664c94e6390.jpeg 
      [package_quantity] => 120 Minutes 
      [package_price] => 1236 
      [star_rating] => 3.3333333333333335 
     ) 

) 

Sorun AVG çıkarmak zaman alıyorum tüm sonuçları ile karşılaştırıldığında yukarıdaki sorgu ile sadece tek bir sonuç alıyorum olmasıdır sütunu. AVG olmadan sorgunun

SELECT 
    p.id as package_id, 
    p.title as package_title, 
    p.path as package_image, 
    p.packageQuantity as package_quantity, 
    p.price as package_price 
FROM 
    package as p 
INNER JOIN vendor as v ON v.id = p.vendor_id 

Sonuç:

Array 
(
    [0] => Array 
     (
      [package_id] => 1 
      [package_title] => Normal 
      [package_image] => 38fbe34ff595a282a171c6058f40f676bde91665.jpeg 
      [package_quantity] => 120 Photos 
      [package_price] => 1200 
     ) 
[1] => Array 
    (
     [package_id] => 2 
     [package_title] => Medium Package(Ui) 
     [package_image] => 5c9a34123d7e18237641355c59e91b10570e0fed.jpeg 
     [package_quantity] => 250 Photos 
     [package_price] => 2400 
    ) 

[2] => Array 
    (
     [package_id] => 3 
     [package_title] => Simple 
     [package_image] => 1f496761e41e3b23d014f5511d591664c94e6390.jpeg 
     [package_quantity] => 120 Minutes 
     [package_price] => 1236 
    ) 

[3] => Array 
    (
     [package_id] => 4 
     [package_title] => Better Package 
     [package_image] => d0ab8bee318da6b3f1d515835cadcc8669afc0f2.jpeg 
     [package_quantity] => 250 Minutes 
     [package_price] => 2366 
    ) 

[4] => Array 
    (
     [package_id] => 5 
     [package_title] => Advance Package 
     [package_image] => 532b67366f327a17a4cb3e5b194d52950dd58a9b.jpeg 
     [package_quantity] => 600 Minutes 
     [package_price] => 5698 
    ) 

[5] => Array 
    (
     [package_id] => 6 
     [package_title] => Excellent Package 
     [package_image] => 6b7272f9ae03229e41bde2e5933e42b4db061c70.jpeg 
     [package_quantity] => 1000 Minutes 
     [package_price] => 8966 
    ) 

)

Ben bile olsa, bütün paketleri alıp bunlardan katları olacak satıcının ortalama derecesi olduğunu göstermeye gerekiyor tekrarlayan. Bir GROUP BY sütun tanımlamak gerekir böylece

SELECT 
    p.id as package_id, 
    p.title as package_title, 
    p.path as package_image, 
    p.packageQuantity as package_quantity, 
    p.price as package_price, 
    (SELECT AVG(r.star_rating) 
    FROM vendor v INNER JOIN 
      review r 
      ON r.vendor = v.id 
    WHERE v.id = p.vendor_id 
    ) as star_rating 
FROM package p; 
+0

, bu basit aşağıdakileri dikkate İki adımlı eylem: 1. Henüz yapmadıysanız, sorunu daha kolay çoğaltabilmemiz için uygun DDL'leri (ve/veya bir sqlfiddle) sağlayın. 2. Henüz yapmadıysanız, 1. adımda sağlanan bilgilere karşılık gelen istenen bir sonuç kümesi belirtin. – Strawberry

cevap

2

Bunun bir alt sorgu için iyi bir fırsat olduğunu düşünüyorum Eğer isterseniz

SELECT 
    p.id as package_id, 
    p.title as package_title, 
    p.path as package_image, 
    p.packageQuantity as package_quantity, 
    p.price as package_price, 
    AVG(r.star_rating) as star_rating 
FROM 
    package as p 
INNER JOIN vendor as v ON v.id = p.vendor_id 
INNER JOIN review as r ON r.vendor = v.id 
GROUP BY p.id