2017-01-09 52 views
3

我们已经做了一个搜索字段,您可以搜索多种成分,并找到食谱。高级订单时搜索

我们希望根据食谱中的大部分成分从搜索框中对食谱进行分类。

if (isset($_POST['search'])) { 
$searchquery = $_POST['search']; 

$vals = "'" . str_replace(",", "','", $searchquery) . "'"; 

$query = mysql_query("SELECT * FROM opskrifter WHERE id IN 
(SELECT opskrifterid FROM ingredienser WHERE ing_name IN ('$vals'))") or die("search failed"); 

是否可以对它们进行排序?

编辑: 配方表

+---------+----------+-------------+------------+------------+--+ 
| id | name  | procedure | category | image_url | | 
+---------+----------+-------------+------------+------------+--+ 
|  1 | Sausage | Fry it  | Main dish | www....com | | 
|  2 | Pizza | Bake it  | Main dish | www....com | | 
|  3 | Burger | Eat it  | Main dish | www....com | | 
+---------+----------+-------------+------------+------------+--+ 

成分表

+---------+----------+-------------+------------+------------+--+ 
| id | recipeid | ing_num | ing_meas | ing_name | | 
+---------+----------+-------------+------------+------------+--+ 
|  1 | 1  | 1   | stack  | sausage | | 
|  2 | 2  | 200   | g   | wheat  | | 
|  3 | 2  | 100   | g   | beef  | | 
+---------+----------+-------------+------------+------------+--+ 

UPDATE

我试图实现从初级/雷蒙德的解决方案:

"SELECT *, COUNT(*) as `total_ingredients` 
    FROM opskrifter as k 
    , ingredienser as i 
WHERE k.id = i.opskrifterid 
    AND i.ing_name IN ($vals) 
    GROUP BY k.id 
ORDER BY COUNT(*) DESC" 

$vals = "'" . str_replace(",", "', '", $searchquery) . "'";$searchsquery = $_POST['search']; //From the searchfield

不幸的是,搜索只需要第一个字进去,例如: “盐,意大利面”,它显示每个含有菜谱的盐。但包含这两种成分的配方不是排序最高的配方。

我错过了什么?

+0

请提供你的表结构,样本数据和期望的输出更清晰的解释对于观众 – Beginner

+1

您搜索的内容是“相关性”,您可以通过最匹配的条款进行订购。类似于http://stackoverflow.com/questions/18725941/mysql-order-by-best-match –

+0

@Beginner这里是表:) :) – Jacob

回答

0

雅各!

我认为这个查询可以解决你的问题。 请尝试一下。

SELECT k.id 
    , k.name 
    , COUNT(*) 
    FROM opskrifter k 
    , ingredienser i 
WHERE k.id = i.opskrifterid 
    AND i.ing_name IN ('sausage','beef', 'wheat') 
ORDER BY COUNT(*) DESC 
+0

不幸的是,它只显示一个配方,当按计数排序:( – Jacob

1

下面我只是错过了一个GROUP BY之前,这就是为什么它只有返回一行

SELECT k.id 
    , k.name 
    , COUNT(*) as `total_ingredients` 
    FROM receipts as k 
    , ingredients as i 
WHERE k.id = i.receipt_id 
    AND i.ing_name IN ('sausage','beef', 'wheat', 'sauce', 'flour', 'wheat', 'beef', 'ketsup', 'onion', 'garlic') 
    GROUP BY k.id, k.name 
ORDER BY COUNT(*) DESC; 
答案

JS Fiddle Here

+0

@Raymond我尝试过实施你的解决方案,看看上面:) – Jacob