如何在单元格包含由逗号分隔的更多多值时显示数据

时间:2012-11-28 12:52:18

标签: php mysql sql

我有以下代码,但我遇到了问题。

$query = "SELECT p.*,(TO_DAYS(p.start_date) - TO_DAYS(NOW())) AS daydiff FROM #__jblance_project p ".
                 "WHERE p.status=".$db->quote('COM_JBLANCE_OPEN')." AND p.approved=1  AND '$now' > p.start_date AND  p.id_category=202 ".
                 "ORDER BY p.is_featured DESC, p.id DESC ".

问题是当字段id_category只有一个像

这样的值时
202,203,204

它没有显示任何结果,但我已将代码更改为

AND  p.id_category=202 OR .id_category=203 OR .id_category=204

因为单元格包含以逗号分隔的所有值

任何建议。

由于 d。

4 个答案:

答案 0 :(得分:0)

$query = "SELECT p.*,(TO_DAYS(p.start_date) - TO_DAYS(NOW())) AS daydiff FROM #__jblance_project as p ". "WHERE p.status=".$db->quote('COM_JBLANCE_OPEN')." AND p.approved=1 AND '$now' > p.start_date AND p.id_category=202 ". "ORDER BY p.is_featured DESC, p.id DESC ".

将FROM #__jblance_project添加为p

答案 1 :(得分:0)

扩展我的评论,请考虑更改此内容:

SELECT p.*,(TO_DAYS(p.start_date) - TO_DAYS(NOW())) AS daydiff 
FROM #__jblance_project p
WHERE p.status=<something>
AND p.approved=1  AND '$now' > p.start_date 
AND p.id_category=202
ORDER BY p.is_featured DESC, p.id DESC

类似于:

SELECT p.*,(TO_DAYS(p.start_date) - TO_DAYS(NOW())) AS daydiff 
FROM #__jblance_project p
WHERE p.status=<something>
AND p.approved=1  AND '$now' > p.start_date 
AND 0 < FIND_IN_SET(202, p.id_category)
ORDER BY p.is_featured DESC, p.id DESC

另外,我可能会将完整的PHP语句写成:

$query = sprintf('SELECT p.*,(TO_DAYS(p.start_date) - TO_DAYS(NOW())) AS daydiff 
    FROM #__jblance_project p
    WHERE p.status=%s
    AND p.approved=1  AND '%s' > p.start_date 
    AND 0 < FIND_IN_SET(202, p.id_category)
    ORDER BY p.is_featured DESC, p.id DESC', $db->quote('COM_JBLANCE_OPEN'), $now);

请注意,这比“正确”的解决方案更具解决方法。您应该考虑重新格式化数据库,使每个字段有一个条目,而不是以逗号分隔的列表。

后两个使用FIND_IN_SET字符串函数,它应该很难实现你的目标。

This related question尤其是答案和评论可能具有指导意义。

答案 2 :(得分:0)

没有真正可靠的方法来做到这一点......你会遇到像丑陋的事情:

id_category LIKE "%,123" OR
id_category LIKE "123,%" OR
id_category LIKE "%,123,%" OR
id_category = "123"

这是如此丑陋的原因,是因为使用像这样的分隔字段是个坏主意。相反,您应该创建一个包含两列的单独表:

  • 项目ID
  • 类别ID

这是一种多对多的关系。

如果您确实希望进一步了解您的黑客行为,我建议您不要将id_category格式化为:

123,456,789

但相反:

,123,456,789,

因此请在之前和之后加入逗号。至少你可以简化你喜欢的查询:

id_category LIKE "%,123,%"

编辑:我不知道FIND_IN_SET。这听起来像是一个有效的解决方案,虽然规范化您的数据仍然会给您带来更好的结果。

答案 3 :(得分:0)

你在mysql中使用了IN()关键字。

p.id_category IN (202,203,204)

在这里你可以像这样传递动态类别id数组。

$array_cat_id = impload(',' ,$pass_array_of_the_id);

p.id_category IN ($array_cat_id)