2013-01-04 141 views
3

試圖寫一個MySQL查詢,並有這個很難。mySQL相關子查詢

我有兩個表(項目:信息有關的項目,並itemReview評論的項目)

我希望做的是選擇屬於一個特定的位置(這是我的外的所有項目查詢一樣),然後在外部查詢中的每個項目,拿在itemReview表

在這裏,所有的評價領域的平均水平是我的嘗試:

SELECT 
    Item.idDish, 
    Item.dateAdded, 
    Item.dateModified, 
    Item.fidLocation, 
    Item.category, 
    Item.description, 
    Item.price, 
    Item.name, 
    Item.fullImageName, 
    Item.thumbnailImageName, 
    sub.rating 
FROM Item 
JOIN (
     SELECT 
      AVG(ItemReview.rating) AS rating 
     FROM ItemReview 
     WHERE ItemReview.fidItem = Item.idItem 
    ) AS sub 
WHERE Item.fidLocation = '63'; 

但MySQL的說:未知列「項目。 idItem'in'子句'

任何幫助將非常感謝!謝謝!!

+0

您沒有正確加入也沒有從項目表中選擇itemid –

回答

7

您正試圖訪問子查詢中的Item.idItem,但它在那裏不可用。你應該使用這樣的事情:

SELECT 
    Item.idDish, 
    Item.dateAdded, 
    Item.dateModified, 
    Item.fidLocation, 
    Item.category, 
    Item.description, 
    Item.price, 
    Item.name, 
    Item.fullImageName, 
    Item.thumbnailImageName, 
    sub.rating 
FROM Item 
JOIN 
(
    SELECT fidItem, AVG(ItemReview.rating) AS rating 
    FROM ItemReview 
    GROUP BY ItemReview.fidItem 
) AS sub 
    ON sub.fidItem = Item.idItem 
WHERE Item.fidLocation = '63'; 
+0

@Eric感謝您的編輯。 – Taryn

+0

非常感謝每個人,這工作! – dbrateris

3

查詢:

SELECT 
    Item.idDish, 
    Item.dateAdded, 
    Item.dateModified, 
    Item.fidLocation, 
    Item.category, 
    Item.description, 
    Item.price, 
    Item.name, 
    Item.fullImageName, 
    Item.thumbnailImageName, 
    ( SELECT 
      AVG(ItemReview.rating) AS rating 
     FROM ItemReview 
     WHERE ItemReview.fidItem = Item.idItem 
    ) AS rating 
FROM Item 
WHERE Item.fidLocation = '63' 
+0

我認爲這個答案更接近提問者試圖做的事情,而且它通常比帶有'group by'的解決方案運行得更快。 –

0

試試這個:

SELECT i.idDish, i.dateAdded, i.dateModified, i.fidLocation, i.category, 
     i.description, i.price, i.name, i.fullImageName, 
     i.thumbnailImageName, ir.rating 
FROM Item i 
LEFT JOIN (SELECT fiditem, AVG(ItemReview.rating) AS rating 
      FROM ItemReview 
      GROUP BY fiditem) ir ON ir.fidItem = i.idItem 
WHERE i.fidLocation = '63'; 
0

試試這個

SELECT 
    Item.idDish, 
    Item.dateAdded, 
    Item.dateModified, 
    Item.fidLocation, 
    Item.category, 
    Item.description, 
    Item.price, 
    Item.name, 
    Item.fullImageName, 
    Item.thumbnailImageName, 
    sub.rating, 
    Item.idItem 
FROM Item 
JOIN (
     SELECT 
      AVG(ItemReview.rating) AS rating , 
      fidItem 
     FROM ItemReview 
     GROUP BY fidItem 
    ) AS sub on sub.fidItem = Item.idItem 
WHERE Item.fidLocation = '63'; 
0

您不能引用 「外」 表以這種方式。一種解決方案已經提出bluefeet,另外這也將工作你的情況:

SELECT 
Item.idDish, 
Item.dateAdded, 
Item.dateModified, 
Item.fidLocation, 
Item.category, 
Item.description, 
Item.price, 
Item.name, 
Item.fullImageName, 
Item.thumbnailImageName, 
(SELECT AVG(ItemReview.rating) AS rating 
    FROM ItemReview 
    WHERE ItemReview.fidItem = Item.idItem 
) as rating 
FROM Item 
WHERE Item.fidLocation = '63'; 
0

這個怎麼樣:

SELECT 
    Item.idDish, 
    Item.dateAdded, 
    Item.dateModified, 
    Item.fidLocation, 
    Item.category, 
    Item.description, 
    Item.price, 
    Item.name, 
    Item.fullImageName, 
    Item.thumbnailImageName, 
    sub.rating 
FROM Item myTable 
JOIN (
     SELECT 
      AVG(ItemReview.rating) AS rating 
     FROM ItemReview 
     WHERE ItemReview.fidItem = myTable.idItem 
    ) AS sub 
WHERE Item.fidLocation = '63'; 

在這裏,你是給一個名稱,主查詢和引用新子查詢中的表名。使用原始表名會導致MySQL不知道表所採用的內容。