2010-08-03 62 views
0

在一个表“合作伙伴”,我有一个字段“网站”,可以包含值像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

您有一个包含逗号分隔值的字段?为什么? – Tomalak 2010-08-03 09:52:53

回答

3

看到FIND_IN_SET

+0

隐藏的解决方案 – AlexanderMP 2010-08-03 09:58:13

+1

是的,但它完全符合Cyril的要求。就像你指出的那样,它应该作为某种关系来实现。 :) – 2010-08-03 10:02:37

+1

@亚历山大,我承认。这是一个丑陋问题的可怕解决方案。 – ceteras 2010-08-03 10:05:59

0
SELECT * FROM partners WHERE partners.sites like '%27%' 
+2

不,这也匹配127。 – Tomalak 2010-08-03 09:54:16

+0

如果有的话,就像这样:'',',',partners.sites,',')像'%,27,%'' - 但这很可怕。 – Tomalak 2010-08-03 09:56:08

+0

的确,这不是一个好的解决方案 – Cyril 2010-08-03 09:56:50

1

手册这没有任何意义

为什么不 select * from partners where sites=27

或者您是否建议sites是一个包含CSV的varchar? 在这种情况下,从任何角度来看都是完全错误的。在数据库中建立一对多的关系。

-1

假设网站在你查询同一表中的字段,你可以试试这个:

SELECT * FROM partners WHERE sites LIKE %27; 

SELECT * FROM partners WHERE sites LIKE 27; 

运作的?

+0

LIKE不仅没有帮助这种形式,而且它期望27是唯一的字符串(这消除了对LIKE的需要)或最后(为什么?) – AlexanderMP 2010-08-03 09:56:50

+0

真,这是一个已经很糟糕的解决方案,已经是一个混乱的问题。我不得不同意创建一对多的多对一关系。 – SimonDowdles 2010-08-03 10:05:25

1

您可能想要使用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) 
+0

+1,暂定。解决手头的问题,但可以继续使用非常糟糕的数据库设计。我认为真正要做的是摆脱CSV字段,并使用1:n关系表。 – Tomalak 2010-08-03 09:59:57

+0

@Tomalak:是的,我同意。 – 2010-08-03 10:01:49

0

我将不得不同意在使用的关系将不仅是更好的做法,但将优化您的数据库请求的速度,以及,即使它不明显,每一位都很重要。

因此,假设你有所谓的网站一个单独的表,你可以做一个调用,比如如下:

SELECT * FROM伙伴其中PID IN(SELECT SPID从网站,SITEID = 27);然后

你的关系可能是这样的:

------------------------------------- 
PARTNERS 
------------------------------------- 
pid  | some field | 
2   |   | 
------------------------------------- 

------------------------------------- 
SITES 
------------------------------------- 
spid  | siteid  | surl 
2   | 27   | http://... 
-------------------------------------