按成分名称查找配方,然后排序

时间:2017-05-21 19:32:43

标签: sql database postgresql

我在编写数据库查询时遇到问题。我在这里找到了许多类似的例子,并且一直试图让它绕过我的头几个小时,但没有一个例子帮助我弄清楚如何得到我想要的结果。我正在构建一个食谱应用程序,但我对涉及数据库的所有内容都很陌生 我想选择 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));

1 个答案:

答案 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