Няправільнае выкарыстанне "IN»?

Я спрабую знайсці ўсе ўваходжання радкі ў поле з дапамогай каманды IN, але не вяртае вынікі, калі я ведаю, што павінен быць нейкі. Я думаю, што лепшы спосаб паказаць вам гэта на прыкладзе:

mysql> SELECT detail_sections FROM inet_staff_details WHERE detail_sections !='';
+-----------------+
| detail_sections |
+-----------------+
| 10,11           |
| 10,11           |
| 10,11           |
| 10,11           |
+-----------------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM inet_staff_details WHERE 11 IN (detail_sections);
Empty set, 4 warnings (0.00 sec)

mysql> SELECT * FROM inet_staff_details WHERE '11' IN (detail_sections);
Empty set (0.00 sec)

Як вы можаце бачыць, нумар 11 знаходзіцца ў коскі, але не адлюстроўваецца ў выніках пошуку. Калі ласка, вы можаце параіць, што я раблю няправільна?

Прывітання.

0

5 адказы

Паспрабуйце гэты запыт -

SELECT * FROM inet_staff_details WHERE FIND_IN_SET(10, detail_sections);

FIND_IN_SET функцыя.

4
дададзена
Вялікі дзякуй гэта зрабіў трук выдатна.
дададзена аўтар scampbell, крыніца

Што IN робіць, каб убачыць, калі ёсць якое-небудзь значэнне ў слупку (у дадзеным выпадку detail_sections ), якая роўная паказаным значэнні (у дадзеным выпадку 11 ).

Вы павінны выкарыстоўваць LIKE , каб атрымаць значэнне, якія вы хочаце.
гэта значыць

SELECT * FROM inet_staff_details 
WHERE detail_sections LIKE '11,%'
   OR detail_sections LIKE '%,11' 
   OR detail_sections LIKE '%,11,%' 
   OR detail_sections = '11';
2
дададзена
-1, таму што гэта будзе прамалёўвацца 113, 411, 51124 і г.д.
дададзена аўтар Brian, крыніца
@ Браян праўда, але гэта прыклад. Запыт будзе мадыфікаваць так ці інакш заснаваныя на значэннях, але да я магу змяніць запыт, каб не абраць 113, 411, 51124 і г.д.
дададзена аўтар Jan S, крыніца

Ды IN не будзе працаваць для вас тут. IN прызначаны, каб выбраць поўныя значэння, а не падрадка, які з'яўляецца Bascially, што вы атрымалі тут. Ваша праблема ў тым, што гэта ў асноўным недахопы праектавання баз дадзеных, якая робіць пошук пэўных значэнняў, такіх як 11 сапраўды складана.

ваш выбар

(А) перапраектоўваць яго крыху (чытанне на нармалізацыю баз дадзеных і аб'яднання табліц), ці

(b) search where: detail_sections = '11' or detail_sectoins LIKE '11,%' or detail_sections LIKE '%,11,%' or detail_sections LIKE '%,11'

1
дададзена
Пагадзіцеся, яго не самы лепшы дызайн. Не ведаю, пра што я думаў усе гэтыя месяцы таму, але Im на шчыльны графік так хутка выправіць трэба будзе зрабіць зараз!
дададзена аўтар scampbell, крыніца

Нешта накшталт гэтага:

   select * from inet_staff_details 
   where instr(concat(',', detail_sections, ','), ',11,') > 0
0
дададзена

Паспрабуйце гэта:

SELECT * FROM inet_staff_details 
WHERE detail_sections LIKE '%,11,%'
OR detail_sections LIKE '%,11'
OR detail_sections LIKE '11,%'
OR detail_sections = '11'
0
дададзена