2010-06-05 62 views
2
SELECT bp.*,r.rating,COUNT(r.review_for),bp.business_name,bp.profile_member 
    FROM ibf_business_reviews r 
LEFT JOIN ibf_business_profiles bp ON (r.review_for=bp.profile_member) 
    WHERE bp.sub_category LIKE '%{$id},%'{$location_sql} 
GROUP BY r.review_for HAVING COUNT(r.review_for) >=1 
ORDER BY r.date_posted DESC LIMIT 0,2"); 

此查询用于在特定位置显示某个子类别id'%{$ id}中的business_name结果。我的问题是多余的结果显示在共享第二或第三位又名... viewcat & ID = 54将显示在..viewcat & ID = 154等等我使用LIKE可能是我的问题在SQL语句中使用LIKE时没有完全匹配

类别? WHERE bp.sub_category LIKE '%{$id},%'

+1

喜@强尼 - 凯瑟尔〜你可以重新格式化SQL,并且可以验证问题的措辞就像你想要的?如果我了解你,你想知道如何停止匹配诸如154的东西,但只匹配54?然后使用=而不是'LIKE' ... – jcolebrand 2010-06-05 04:25:15

+0

+!因为需要重新格式化SQL。你意识到“百分比”符号(%)是通配符。所以你基本上告诉它,你可以返回任何包含'id'的东西...所以如果你搜索“23”,你可以得到“123”,你可以得到“234”或“1234”......等。 – 2010-06-05 04:28:36

+0

道歉的格式问题,我会给那个镜头摇滚 – user338813 2010-06-05 04:37:51

回答

1

这里是我的评论

+!因为需要重新格式化SQL。您意识到“百分比”符号(%)是通配符。所以你 基本上告诉你,你可以 返回任何包括身份证...如此 如果你搜索“23”,你可以得到 “123”,你可以得到“234”或 “1234”...等

和你说

感谢@Rock移除工作的通配符!

现在我的答案是......如果你从字符串中删除了两个通配符,那么你基本上是在做一个“等号”。

IE:

WHERE bp.sub_category LIKE '{$id},' 

应该是一样的

WHERE bp.sub_category = '{$id},' 

因为你没有在 “LIKE” 语句中的任何通配符 “匹配”。

请原谅我,如果我搞砸了“$”或“” ......我不是一个MySQL的家伙

+0

真棒谢谢我会投你的答案,但我没有代表..这是公认的答案! – user338813 2010-06-05 05:32:20

+0

即使你不能投票,你也应该能够“检查”它。 – 2010-06-05 05:33:47

+0

_____ ;-) _____ – 2010-06-05 05:35:10

3

当您应该在子表中存储每行一个数字时,您正在将逗号分隔的列表存储在varchar中。那么你根本不需要使用LIKE

请阅读First Normal Form

+0

谢谢比尔我有点继承这个数据模型,但很好的建议..我会给你投票,但我还没有代表 – user338813 2010-06-05 04:47:43

+0

聪明的演绎... @OP:你可能想投资一些时间来标准化数据库,如果你有这种力量......即使有人把它放在你的腿上。 – mpen 2010-06-05 05:30:48

+0

谢谢@Mark ..我认为这是正确的做法,这是我周末的生活 – user338813 2010-06-05 05:38:20