使用whereIn形式的sql数据库获取重复数据

时间:2018-11-14 04:19:00

标签: php mysql laravel

当我使用where时,我有ids [1,1,2,1,1,1]的数组。在不重复数据的情况下,我仅获得[1,2]的数据,如何使其以相同的顺序获得[1,1,2,1,1,1]? / p>

 $selected_tasknotes_persons_made_comment = tasksNote::where("noted_task", request()->task_id )->get()->pluck('user_id');

// $ selected_tasknotes_persons_made_comment = [1,1,2,1,1,1]

 $persons_gave_notes = User::whereIn('id', $selected_tasknotes_persons_made_comment )->get();

2 个答案:

答案 0 :(得分:2)

在SQL中,您的查询可能如下所示:

select id
from sometable
where id IN(1,1,2,1,1,1)

IN(1,1,2,1,1,1)在SQL中的含义是:

select id
from sometable
where (id = 1 or id = 1 or id = 2 or id = 1 or id = 1 or id = 1)

如果表中只有一行id = 1的行,则只会返回该行。它不会乘以您为该行过滤的次数。

还要注意,通常(按照惯例)列id在表中是唯一的,因此,可能只有id = 1的一行和id = 2的一行。

另外,在SQL表中是“无序集”,根本无法保证,除非您应用order by子句,否则您会以任何特定或可预测的顺序获得结果集。

简而言之,您期待SQL根本无法做到的事情。

您可以将数组值插入到表(或“派生表”)中,该表中的每行一个值(例如,示例中为6行),然后将其连接到源数据,然后将获得更多行。例如

select tablex.id
from tablex
inner join (
    select 1 as n, 0 as sortby union all
    select 1 as n, 1 as sortby union all
    select 2 as n, 2 as sortby union all
    select 1 as n, 3 as sortby union all
    select 1 as n, 4 as sortby union all
    select 1 as n, 5 as sortby
    ) myarray on tablex.id = myarray.n
order by
    myarray.sortby

答案 1 :(得分:1)

根据您的查询User::whereIn('id', $selected_tasknotes_persons_made_comment )->get(),这意味着它返回唯一性结果,如果要获取重复的记录,请按照以下说明进行操作:

您可以在laravel中执行原始查询以获取重复值,其中使用UNION ALL

 $sql_query= 'SELECT u.*
    FROM User u
    JOIN ( SELECT 1 AS id UNION ALL SELECT 1 AS id
    UNION ALL SELECT 2 AS id
    UNION ALL SELECT 1 AS id
    UNION ALL SELECT 1 AS id
    UNION ALL SELECT 1 AS id
    ) i ON i.id= u.id';

因此,您可以像这样执行原始查询

$results = DB::select($sql_query);

另一种方式(使用雄辩的方法):我对下面的查询有点困惑,但是您可以使用havingRaw

尝试这种方式
 User::whereIn('id', $selected_tasknotes_persons_made_comment )
 ->havingRaw('count(*) > 1'); })->get()