我有以下代码,但我遇到了问题。
$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。
答案 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_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)