我正在为移动应用程序编写PHP准备语句,该应用程序将搜索数据库中列出的啤酒,并允许用户将这些啤酒添加到他们自己的数据库中,并对它们进行评级并添加注释等。
我想有一个搜索功能,它将从啤酒表中选择所有,然后检查myBeers表以获得平均值,如果该啤酒被列出。
在联接中,beerID是两个表的共同字段。
我的数据库中有两个表需要使用:一个是啤酒表,其中包含各种啤酒的5000条记录,包括beerID,name,abv,abu,srm等。我需要能够当它像LIKE输入时搜索这个表。我有一个看起来像这样的查询:
SELECT *
FROM beers
WHERE name LIKE :name
另一个是myBeers表,它具有userID和beerID以及评级和评论列。我有一个看起来像这样的查询:
SELECT AVG(rating) as ratingAverage
FROM myBeers
WHERE beerID = :beerID'
我想将这些结合到一个语句中,该语句将在啤酒表中搜索某些名称,然后从myBeers表中提取平均值。如果没有平均值,那么我希望它为0而不是null。
到目前为止,我已尝试加入和子查询 - 但是当我尝试使用LIKE选项时,它们都会卡住。
我试过了:
SELECT b.*, AVG(m.rating) AS avgRating
FROM beers b
INNER JOIN myBeers m
ON b.beerID = m.beerID
WHERE (SELECT name
FROM beers
WHERE name LIKE 'Hocus')
我得到了一大堆。
如果有人能帮助我,我将不胜感激。我试图包括一切。谢谢你的帮助!
答案 0 :(得分:1)
您应该可以使用以下内容:
SELECT b.name,
AVG(m.rating) AS avgRating
FROM beers b
LEFT JOIN myBeers m
ON b.beerID = m.beerID
WHERE b.name LIKE '%Hocus%'
GROUP BY b.name
您的WHERE子句中不需要其他查询。这将检查啤酒的name
是否与您传入的字符串相似。您只需要确定LIKE上的通配符%
的位置。我已将其添加到Hocus
的开头和结尾,但您最后可能只需要它。
此外,由于您使用的是聚合函数Avg()
,因此需要使用GROUP BY
子句。 GROUP BY应包含选择列表中包含的其他列。您会注意到我删除了select *
广告,将其替换为select b.name
。
此外,如果您想要退回没有评级的啤酒,您将需要使用LEFT JOIN而不是INNER JOIN。即使beers
表中没有匹配的行,LEFT JOIN也会返回myBeers
表中的所有行。