将 select 传递到 where_in Codeigniter

问题描述 投票:0回答:2

我正在尝试选择 ids 并将其传递到更新中使用此

$query = $this->db->query("SELECT GROUP_CONCAT(a.sponsor_id) as sponstr FROM (select sponsor_id from sponsor  WHERE (pay_success = 'yes')AND (end_date_time > NOW()) and ((country_id = 1 and state_id = 24) or city_id = 123)
order by rand() limit 0,10) a");

    if($query->num_rows()>0)
    {
     foreach($query->result() as $sponsorids)
     {

        $data['se_count'] = 0;
        $this->db->where_in('sponsor_id',$sponsorids->sponstr);
        $this->db->update('sponsor',$data);

     }
     }

但是所有 id 都不会更新,只有第一个 id 会更新。

where_in 生成下面的代码

 WHERE sponsor_id IN ('5,4,2,3,1')

我认为应该是这样

  WHERE sponsor_id IN (5,4,2,3,1)

我是否遗漏了什么,或者我是否做错了什么,而我显然知道自己做错了。请帮忙

mysql codeigniter
2个回答
4
投票

你应该在那里传递一个数组。所以通过不是

$sponsorids->sponstr
而是
explode(',', $sponsorids->sponstr)

这似乎是一个糟糕的数据库设计决策,花一些时间看看多对多的概念


0
投票

此任务可以通过一次数据库访问来执行,因此应该这样做。 可以放弃使用 GROUP_CONCAT()。 UPDATE 查询需要一个 WHERE 子句,该子句在 IN 条件中使用子查询。 该子查询将包含所有限定逻辑、随机化和行限制。

因为某些 SQL 风格(至少是 MySQL)不允许在 IN 条件中直接使用 LIMIT,所以子查询需要包装在 SELECT 查询中。

原始 UPDATE 查询将如下所示:

UPDATE `sponsor`
SET `se_count` = 0
WHERE `sponsor_id` IN (
    SELECT *
    FROM (
        SELECT sponsor_id
        FROM sponsor
        WHERE pay_success = 'yes'
            AND end_date_time > NOW()
            AND (
                 (
                  "country_id" = 1
                  AND "state_id" = 24
                 )
                 OR "city_id" = 123
            )
        ORDER BY RAND()
        LIMIT 10
    ) rand_ids
)

为了实现此呈现的 SQL,CodeIgniter 查询生成器脚本将使用两个编译查询字符串来安全地生成子查询。

$randSponsorIds = $this->db
    ->select('sponsor_id')
    ->where('pay_success', 'yes')
    ->where('end_date_time >', 'NOW()', false)
    ->group_start()
        ->group_start()
            ->where([
                'country_id' => 1,
                'state_id' => 24
            ])
        ->group_end()
        ->or_where('city_id', 123)
    ->group_end()
    ->order_by('RAND()')
    ->limit(10)
    ->get_compiled_select('sponsor');

$sponsorIds = $this->db
    ->get_compiled_select("($randSponsorIds) rand_ids");

$this->db
    ->set('se_count', 0)
    ->where_in('sponsor_id', $sponsorIds, false)
    ->update('sponsor');
© www.soinside.com 2019 - 2024. All rights reserved.