我有以下
return DB::table('recipe_symbols')
->where('symbol_id', 8)
->get(['recipe_id']);
它运作得很好。现在我有以下内容返回更多过滤结果
return DB::table('recipe_symbols')
->where('symbol_id', 8)
->where('symbol_id', 16)
->get(['recipe_id']);
即使存在symbol_id 8和16的行,我也没有得到任何结果。我尝试使用原始查询,仍然是同样的问题。
出了什么问题?我想要实现的是根据用户选择的符号,symbol_id
获取食谱。
我尝试了whereIn()
,但这会带回具有某个symbol_id
但没有另一个symbol_id
的食谱。例如,它带来了两个食谱,其中一个只有symbol_id
只有8个,第二个有8和16.我需要得到recipe_symbols_table
----------------------
|id | recipe_id | symbol_id |
-----------------------------
|1 | 2 | 8
|2 | 2 | 16
|3 | 3 | 8
|4 | 3 | 16
|5 | 4 | 8
|6 | 4 | 30
|7 | 5 | 8
|8 | 5 | 28
|9 | 6 | 8
|10 | 6 | 31
|11 | 7 | 8
|12 | 7 | 18
= 8和16的所有食谱,没有别的。
EDIT *** 数据库结构
$sql = 'SELECT * FROM sie_hp_cookbook_recipes_symbols WHERE symbol_id=8 and symbol_id=16';
$qry = DB::select($sql);
EDIT ***
BuildConfig.groovy
答案 0 :(得分:1)
如果我理解正确,您希望所有recipe_id
存在某些符号。
这在MySQL中不会是微不足道的。因为MySQL逐行解析只是做AND
将不返回任何内容。一行不能有symbol_id
8和16.
因此我们需要比较具有相同行的两个表。这通常使用JOIN
和相交来完成。但MySQL并不支持交叉。
(因此有问题。)
使用UNION
和GROUP BY
的组合,我们可以模拟一个剖面,但我不知道如何使用Eloquent。
因此,您最好的选择是raw_query
。对此的原始MySQL查询将是
SELECT recipe_id from (
(SELECT * FROM sie_hp_cookbook_recipes_symbols WHERE symbol_id=8)
UNION ALL
(SELECT * FROM sie_hp_cookbook_recipes_symbols WHERE symbol_id=16)
) AS t1 GROUP BY recipe_id HAVING count(*) >= 2;
链接到示例小提琴http://sqlfiddle.com/#!9/c4150/15/0
现在是Laravel解决方案
$first= DB::table('recipe_symbols')
->where('symbol_id', 8);
return DB::table('recipe_symbols')->where('symbol_id', 16)
->unionAll($first)
->groupBy('recipe_id')
->having('count(*)>2')
->select(['recipe_id'])
->get();
复杂,呃!
答案 1 :(得分:1)
以下给出了前两个结果(2和3)。希望这有帮助!
SELECT a.`recipe_id`
FROM `recipe_symbols_table` a
INNER JOIN `recipe_symbols_table` b
ON a.`recipe_id` = b.`recipe_id`
WHERE b.`symbol_id` IN (8,16)
GROUP BY a.`recipe_id`
HAVING COUNT(DISTINCT b.`symbol_id`) = 2
答案 2 :(得分:0)
原始查询
SELECT a.recipe_id FROM (
(select * from recype_symbols where symbol_id = 8) a
join (select * from recype_symbols where symbol_id = 16) b
on
a.recipe_id = b.recipe_id)
我不确定这是否正确地以laravel方式
DB::table('recype_symbols')
->join(DB::raw('(select * from recype_symbols where symbol_id = 16 or symbol_id = 8) as b'),'recype_symbols.recipe_id','=','b.recipe_id')
->where('recype_symbols.symbol_id',8)
->where('b.symbol_id',16)
->select(['recype_symbols.recipe_id'])
->get();