Laravel mysql multiple where query

时间:2015-07-26 14:52:51

标签: mysql laravel where-clause

我有以下

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

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望所有recipe_id存在某些符号。

这在MySQL中很难

这在MySQL中不会是微不足道的。因为MySQL逐行解析只是做AND将不返回任何内容。一行不能有symbol_id 8和16.

因此我们需要比较具有相同行的两个表。这通常使用JOIN和相交来完成。但MySQL并不支持交叉。 (因此有问题。)

如何解决

使用UNIONGROUP 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();