我在编写数据库查询时遇到问题。我在这里找到了许多类似的例子,并且一直试图让它绕过我的头几个小时,但没有一个例子帮助我弄清楚如何得到我想要的结果。我正在构建一个食谱应用程序,但我对涉及数据库的所有内容都很陌生 我想选择 1个或更多成分并获得匹配的食谱标题,如果可能,按最佳结果排序(含有大多数成分的食谱) )。 我试图在内部连接中尝试将配方名称与匹配的成分一起使用。
我试图像这个人在这个问题上那样做,因为我们有相同的设计: Recipe Database, search by ingredient
但即使我尝试按照他/她的方式进行加入,只是为了测试(而不是我想要的),我得到了:
ERROR: missing FROM-clause entry for table
以下是我的表格:
Recipe_Ingredient
+-----------+---------------+
| recipe_id | ingredient_id |
+-----------+---------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
| 1 | 6 |
| 1 | 7 |
| 2 | 1 |
| 2 | 8 |
| 2 | 9 |
| 2 | 10 |
| 2 | 11 |
+-----------+---------------+
配方
+-----------+-----------------------+--------------+
| id | name | instructions |
+-----------+-----------------------+--------------+
| 1 | Guacamole | sample text |
| 2 | Grilled avocado toast | sample text |
+-----------+-----------------------+--------------+
成分</ P>
+------------------+
| id | name |
+----+-------------+
| 1 | avocado |
| 2 | tomato |
| 3 | chili |
| 4 | garlic |
| 5 | lemon |
| 6 | salt |
| 7 | black pepper|
| 8 | pesto |
| 9 | spinach |
| 10 | hard cheese |
| 11 | bread |
+------------------+
sql
create table Recipe (
id SERIAL PRIMARY KEY,
name CHAR(50),
prep_time CHAR(10),
instructions VARCHAR(2000));
create table Ingredient (
id SERIAL PRIMARY KEY,
name CHAR(50));
create table Recipe_Ingredient (
recipe_id INT NOT NULL,
ingredient_id INT NOT NULL,
FOREIGN KEY(recipe_id) REFERENCES Recipe(id),
FOREIGN KEY(ingredient_id) REFERENCES Ingredient(id));
答案 0 :(得分:0)
你看起来像这样的查询:
with cte as (
select recipe_id, count(*) as cnt from Recipe_Ingredient
group by recipe_id
) select r.id as Recipeid, r.name, c.cnt from Recipe r join cte c
on r.id = c.recipe_id
order by c.cnt desc