Задать вопрос
Chernichko
@Chernichko
Учусь.

Как правильно написать запрос sql для вывода данных из 2х таблиц?

у меня есть таблица банеров, где товары, которые привязаны к банеру прописаны через запятую. например:

id_banera | id_tovarov
1 | 1,2,3,4
2 | 2,3
3 | 3,4

вторая
kodt | nazv
1 |
2 |
3 |
4 |

Мне надо вывести данные банеров для конкретного товара.
Мой код:
select * from promobanr p join tovar on (kodt=2876 and kodt in(p.id_tovar)) where p.mesto=1 and p.activn =1 and p.databeg < now() and now() < p.datafin order by p.databeg desc

с этим не справляется.
Для товара 1 он выведет данные 1 банера, для 2- даные 2го (хотя должен 1го и 2го), для 3го - только 3го банера (должен 1го, 2го и 3го), а для 4го вообще ничего не выведет.

Как сделать правильный запрос?
  • Вопрос задан
  • 289 просмотров
Подписаться 1 Оценить 6 комментариев
Пригласить эксперта
Ответы на вопрос 4
LINKeRxUA
@LINKeRxUA
web dev
Ваши таблицы не отвечают даже первой нормальной форме!
Лучше привести к такому виду:

stuff //товары                banner
id| price| ... и т.д.            id|width|height| ... и т.д.
|                                 |
|      stuffToBanner              |
|____stuffID | bannerID___________| // и эта комбинация должна быть PK,
// FK на "stuff.id" и  FK на "banner.id"


Тоесть есть:
товары с ID, 1,2,3,4,5,6,7,8,9,10
баннеры с ID, 1,2

и связная таблица
stuffID, bannerID
1,1
1,2
3,1

Тогда по INNER JOIN можно очень быстро определить что выводить, а что нет
Ответ написан
Комментировать
@NikesDark
Анализирую на диване
Через LIKE пробуйте, но это в корне не правильно.
Ответ написан
Комментировать
@heartdevil
плыву как воздушный шарик
Привет.

А если вот так только вывести (без WHERE), у вас данные правильно сопоставляются?

select * from promobanr p join tovar on (kodt=2876 and kodt in(p.id_tovar))


Лучше, конечно, переделать таблицу. В будущем вам еще тяжелее будет стопроцентно.
Ответ написан
Комментировать
Chernichko
@Chernichko Автор вопроса
Учусь.
Спасибо всем.
Переделала таблицы. Все слажено работает)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы