查询包含逗号分隔字符串的列

时间:2014-08-07 08:40:25

标签: php mysql sql

我遇到了sql查询的问题。基本上我有这个方法:

public function loadByDirectoryContact($directoryContact,$type='') 
    {
        global $db;
        $t = 'directoryprogramme';
        $query  = 'SELECT c.* FROM `'.$t.'` c ';
        $query .= 'WHERE `c`.`presenters` = '.$directoryContact->getId().' ';
        $query .= 'OR `c`.`staff` = '.$directoryContact->getId().' ';
        if($type!=""){
            $query .=" AND c.type='".$type."' ";
        }


        $query .= QueryBuilder::orderBy('name','asc');

        echo $query; die();

        $db->query($query,$t);

        while($db->next($t))
        {
            $node = new Programme();
            $node->setId($db->get('id',$t));
            $node->setName($db->get('name',$t));
            $node->setBroadcastTime($db->get('broadcast_time',$t));
            $node->setDescription($db->get('description',$t));
            $node->setDays($db->get('days',$t));
            $node->setSubjects($db->get('subjects', $t));
            $node->setStaff($db->get('staff',$t));
            $node->setPresenters($db->get('presenters',$t));
            $directoryCompany = new DirectoryCompany($db->get('directorycompany_id',$t));
            $node->setDirectoryCompany($directoryCompany);
            $node->setContributors($directoryContact);
            $node->setType($db->get('type',$t));
            $this->nodes->add($node);
        }
    }

它会创建一个这样的查询:

SELECT c.* 
FROM `directoryprogramme` c 
WHERE `c`.`presenters` = 1234
OR `c`.`staff` = 1234
ORDER BY `name` ASC

问题是,演示者列存储了逗号分隔值,所以实际上它看起来像这样

presenters
1234,7738,5097,5100

,对于任何query,其中c.presenters等于此列中不是第一个的任何值,它不返回任何结果。我想知道是否有一种方法可以查询,以便检查整个String

2 个答案:

答案 0 :(得分:2)

您可以使用功能FIND_IN_SET在列表中查找您的值:

SELECT c.* 
FROM `directoryprogramme` c 
WHERE FIND_IN_SET('1234',`c`.`presenters`) > 0
OR `c`.`staff` = 1234
ORDER BY `name` ASC

<强>备注

如果可以,请考虑规范您的表格设计。这意味着演示者ID的单独表格,每个id一行。

答案 1 :(得分:0)

您也可以尝试:

SELECT c.* FROM `directoryprogramme` c WHERE `c`.`presenters` LIKE '%1234%' OR `c`.`staff` = 1234 ORDER BY `name` ASC

我认为演示者列在varchar中。