在一个表“合作伙伴”,我有一个字段“网站”,可以包含值像1,27,38,12MySQL请求在哪里...在
然后,在一个网站的ID为n °27,我想获得与本网站相关的合作伙伴。
我尝试这样做: SELECT * FROM partners WHERE 27 IN (partners.sites)
它的工作原理,如果27是在字符串的开头(如:27,1,128),但是如果27是在中间它不工作(如:1,27 ,38,12)
你有什么想法来管理这个吗?
谢谢。 西里尔
在一个表“合作伙伴”,我有一个字段“网站”,可以包含值像1,27,38,12MySQL请求在哪里...在
然后,在一个网站的ID为n °27,我想获得与本网站相关的合作伙伴。
我尝试这样做: SELECT * FROM partners WHERE 27 IN (partners.sites)
它的工作原理,如果27是在字符串的开头(如:27,1,128),但是如果27是在中间它不工作(如:1,27 ,38,12)
你有什么想法来管理这个吗?
谢谢。 西里尔
看到FIND_IN_SET
隐藏的解决方案 – AlexanderMP 2010-08-03 09:58:13
是的,但它完全符合Cyril的要求。就像你指出的那样,它应该作为某种关系来实现。 :) – 2010-08-03 10:02:37
@亚历山大,我承认。这是一个丑陋问题的可怕解决方案。 – ceteras 2010-08-03 10:05:59
手册这没有任何意义
为什么不 select * from partners where sites=27
?
或者您是否建议sites
是一个包含CSV的varchar? 在这种情况下,从任何角度来看都是完全错误的。在数据库中建立一对多的关系。
假设网站在你查询同一表中的字段,你可以试试这个:
SELECT * FROM partners WHERE sites LIKE %27;
SELECT * FROM partners WHERE sites LIKE 27;
运作的?
LIKE不仅没有帮助这种形式,而且它期望27是唯一的字符串(这消除了对LIKE的需要)或最后(为什么?) – AlexanderMP 2010-08-03 09:56:50
真,这是一个已经很糟糕的解决方案,已经是一个混乱的问题。我不得不同意创建一对多的多对一关系。 – SimonDowdles 2010-08-03 10:05:25
您可能想要使用FIND_IN_SET()
函数,因为IN()
函数不会期望以逗号分隔的字符串作为参数。
这不起作用:
SELECT 27 IN ('1,27,5');
+------------------+
| 27 IN ('1,27,5') |
+------------------+
| 0 |
+------------------+
这工作:
SELECT FIND_IN_SET(27, '1,27,5') > 0;
+-------------------------------+
| FIND_IN_SET(27, '1,27,5') > 0 |
+-------------------------------+
| 1 |
+-------------------------------+
1 row in set (0.00 sec)
+1,暂定。解决手头的问题,但可以继续使用非常糟糕的数据库设计。我认为真正要做的是摆脱CSV字段,并使用1:n关系表。 – Tomalak 2010-08-03 09:59:57
@Tomalak:是的,我同意。 – 2010-08-03 10:01:49
我将不得不同意在使用的关系将不仅是更好的做法,但将优化您的数据库请求的速度,以及,即使它不明显,每一位都很重要。
因此,假设你有所谓的网站一个单独的表,你可以做一个调用,比如如下:
SELECT * FROM伙伴其中PID IN(SELECT SPID从网站,SITEID = 27);然后
你的关系可能是这样的:
-------------------------------------
PARTNERS
-------------------------------------
pid | some field |
2 | |
-------------------------------------
-------------------------------------
SITES
-------------------------------------
spid | siteid | surl
2 | 27 | http://...
-------------------------------------
您有一个包含逗号分隔值的字段?为什么? – Tomalak 2010-08-03 09:52:53