Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: вопрос по IN
 
 автор: Дмитрий Смаль   (19.06.2012 в 14:46)   письмо автору
 
 

Здравствуйте

есть двe таблицы
seminar - список семинаров, два поля:
id - число, номер по порядку
costs - строка, ИД стоимостей через запятую
вторая таблица seminar_cost (стомимости семинара)
с полями
id - число, номер по порядку
name - строка, название
запрос
SELECT sc.id, sc.name, s.id seminar
FROM seminar_cost sc, seminar s
WHERE sc.id
IN ( s.costs ) 
AND s.id =112
выводит только один результат где seminar_cost.id=3, хотя поле seminar.costs в 112 записи содержит строку 3,14,8,20
если сделать такой же запрос, только вместо s.costs подставить значение этого же поля
SELECT sc.id, sc.name, s.id seminar
FROM seminar_cost sc, seminar s
WHERE sc.id
IN ( 3, 14, 8, 20 ) 
AND s.id =112
то будет уже 4 результата для каждой ИД в условии IN ( 3, 14, 8, 20 )

почему так? как сделать запрос чтобы выводились все нужные записи?

  Ответить  
 
 автор: Sfinks   (19.06.2012 в 15:47)   письмо автору
 
   для: Дмитрий Смаль   (19.06.2012 в 14:46)
 

Ключевые слова в этом всем - содержит строку 3,14,8,20
Следовательно "если сделать такой же запрос, только вместо s.costs подставить значение этого же поля", то запрос будет выглядеть не так, как вы написали, а так:
SELECT sc.id, sc.name, s.id seminar 
FROM seminar_cost sc, seminar s 
WHERE sc.id 
IN ( '3, 14, 8, 20' )  
AND s.id =112
, т.е. в IN не набор числовых значений, а ОДНО СТРОКОВОЕ ВЫРАЖЕНИЕ

Исправить запрос, чтоб он работал правильно без переделки структуры БД можно:
SELECT sc.id, sc.name, s.id seminar 
FROM seminar_cost sc, seminar s 
WHERE concat(' ', s.costs, ',') LIKE concat('% ', sc.id, ',%')
AND s.id =112
Но это довольно меееедленный запрос. Если объем данных большой, лучше переделать БД.
_________________
Кстати, вы в двух местах строку со списком написали по разному. Правильно-то как? С пробелами или без? если без, то строка с WHERE должна быть такой:
WHERE concat(',', s.costs, ',') LIKE concat('%,', sc.id, ',%')

  Ответить  
 
 автор: Дмитрий Смаль   (19.06.2012 в 16:08)   письмо автору
 
   для: Sfinks   (19.06.2012 в 15:47)
 

спасибо за ответ
>Ключевые слова в этом всем - содержит строку 3,14,8,20
>Следовательно "если сделать такой же запрос, только вместо s.costs подставить значение этого же поля", то запрос будет выглядеть не так, как вы написали, а так:
SELECT sc.id, sc.name, s.id seminar 
FROM seminar_cost sc, seminar s 
WHERE sc.id 
IN ( '3, 14, 8, 20' )  
AND s.id =112
>, т.е. в IN не набор числовых значений, а ОДНО СТРОКОВОЕ ВЫРАЖЕНИЕ

почему же тогда ищет по первой цифре в IN - в данном случае это 3
я пробовал менять цыфры в поле и всегда ищет только по первой цифре до запятой
если бы было как строка IN ( '3, 14, 8, 20' ) то вообще должен был быть пустой результат как я понимаю

  Ответить  
 
 автор: Lotanaen   (19.06.2012 в 17:09)   письмо автору
 
   для: Дмитрий Смаль   (19.06.2012 в 16:08)
 

в РНР функция intval() аналогично работает, т.е. интерпретатор приводит к числовому виду строку, как только встречается не цифра, то остальные символы отбрасываются...

  Ответить  
 
 автор: Sfinks   (19.06.2012 в 22:15)   письмо автору
 
   для: Дмитрий Смаль   (19.06.2012 в 16:08)
 

Это неявное преобразование типов.
При несовпадении требуемого и предоставленного, пытается привести к требуемому.
В каждом языке работает по своему. В MySQL - как написал Lotanaen. В MSSQL просто выдало бы ошибку.
И в общем-то, если бы первый аргумент был строкой, то вообще ничего не нашлось.
Можете проверить:
SELECT sc.id, sc.name, s.id seminar  
FROM seminar_cost sc, seminar s  
WHERE cast(sc.id as char)  IN ( s.costs )  
AND s.id =112

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования