|
|
|
| Здравствуйте
есть дв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 )
почему так? как сделать запрос чтобы выводились все нужные записи? | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(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, ',%')
|
| |
|
|
|
|
|
|
|
для: 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' ) то вообще должен был быть пустой результат как я понимаю | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(19.06.2012 в 16:08)
| | в РНР функция intval() аналогично работает, т.е. интерпретатор приводит к числовому виду строку, как только встречается не цифра, то остальные символы отбрасываются... | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(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
|
| |
|
|
|
|