1

我有以下代码,但我有问题。

$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

4 回答 4

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 as p

于 2012-11-28T12:56:09.093 回答
0

没有真正可靠的方法可以做到这一点......你遇到了一些丑陋的事情,比如:

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

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

  • 项目的 id
  • 类别的 id

这是一个多对多的关系。

如果您确实想进一步使用您的 hack,我建议不要像这样格式化 id_category:

123,456,789

但反而:

,123,456,789,

所以前后都要加逗号。至少您可以将类似查询简化为:

id_category LIKE "%,123,%"

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

于 2012-11-28T13:05:11.800 回答
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应该笨拙地实现您的目标的字符串函数。

这个相关的问题,尤其是答案和评论可能具有指导意义。

于 2012-11-28T13:03:45.867 回答
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)
于 2012-11-28T13:09:37.730 回答