1

データベースにリストされているビールを検索し、ユーザーがこれらのビールを自分のデータベースに追加したり、評価したり、コメントなどを追加したりできるようにするモバイルアプリケーションの PHP 準備ステートメントを作成しています。

ビール テーブルからすべてを選択し、myBeers テーブルをチェックして、そのビールがリストされているかどうかの平均を取得する 1 つの検索関数を用意したいと考えています。

結合では、beerID は両方のテーブルに共通のフィールドです。

データベースには、使用する必要がある 2 つのテーブルがあります。1 つは、beerID、name、abv、abu、srm など、さまざまなビールの 5000 レコードを含むビール テーブルです。検索できるようにする必要があります。入力のように、このテーブルの場合。次のようなクエリがあります。

SELECT *   
FROM beers   
WHERE name LIKE :name

もう 1 つは myBeers テーブルで、userID と beerID、評価とコメントの列があります。次のようなクエリがあります。

SELECT AVG(rating) as ratingAverage 
FROM myBeers 
WHERE beerID = :beerID' 

これらを 1 つのステートメントに結合して、beers テーブルで何かのような名前を検索し、myBeers テーブルから平均を引き出します。平均がない場合は、null ではなく 0 として表示されるようにします。

これまでのところ、結合とサブクエリを試してみましたが、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')

そして、私は何も得られません。

誰かが私を助けてくれれば幸いです。私はすべてを含めようとしました。ご協力いただきありがとうございます!

4

1 に答える 1

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 句に別のクエリは必要ありません。これにより、ビールの が渡された文字列の LIKE であるかどうかがチェックさnameれます。必要なのは、LIKE のどこにワイルドカードを配置するかを決定することだけです%。の最初と最後に追加しましたが、Hocus必要なのは最後だけかもしれません。

また、集計関数を使用しているため、句Avg()を使用する必要があります。GROUP BYGROUP BY には、選択リストに含まれる他の列を含める必要があります。select *私が広告を削除したことに気付くでしょうselect b.name

また、評価のないビールを返したい場合は、INNER JOIN の代わりに LEFT JOIN を使用する必要があります。LEFT JOIN は、beersテーブルに一致する行がない場合でも、テーブルからすべての行を返しmyBeersます。

于 2013-06-13T14:11:10.843 に答える