SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.11.2022 12:44:31

spiderbuber
Участник
Зарегистрирован: 01.11.2022
Сообщений: 3

Помогите составить SQL запрос по нескольким условиям

Есть 3 таблицы.
books - берётся контент
chanels - места размещения
links - ссылки с размещенным контентом.

Когда места для размещения было одно, просто сравнивал чтобы id_books отсутствовал в таблице links.

SELECT id_books, file_name, nazvanie, opisanie, tags, book_name, book_autor FROM books WHERE (id_books) not IN (select (id_books) from links) AND note IS NULL ORDER BY use_time LIMIT 1


Теперь мест для размещения несколько и в links я конечно записываю какому каналу принадлежит ссылка (id_chanels).
Но вот уже который день ломаю голову, чтобы в этот запрос впихнуть условие по id_chanels.

Мне нужно, чтобы один и тот же контент был на разных каналах, но без повтора на одном и том же.
Т.е. нужно взять записи из books, где связка id_books и id_chanels отсутствует в таблице links.

Как составить такой запрос?

Отредактированно spiderbuber (02.11.2022 06:31:24)

Неактивен

 

#2 01.11.2022 18:42:14

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5788

Re: Помогите составить SQL запрос по нескольким условиям

select ... from books b left join links l on b.id_books = l.id_books and l.id_chanels='"+id_chanels+"' where l.id_books is null

Неактивен

 

#3 02.11.2022 05:00:29

spiderbuber
Участник
Зарегистрирован: 01.11.2022
Сообщений: 3

Re: Помогите составить SQL запрос по нескольким условиям

vasya написал:

select ... from books b left join links l on b.id_books = l.id_books and l.id_chanels='"+id_chanels+"' where l.id_books is null

Большое спасибо. Всё гениальное - просто)

Правильно ли я понял, что в вашей конструкции (используя лефт джойн) вот этот хвост:

where l.id_books is null


Полностью заменяет мой из этого запроса?
WHERE (id_books) not IN (select (id_books) from links)

Отредактированно spiderbuber (02.11.2022 06:21:16)

Неактивен

 

#4 02.11.2022 13:16:14

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5788

Re: Помогите составить SQL запрос по нескольким условиям

да

Неактивен

 

#5 18.11.2022 05:30:55

Smela
Участник
Откуда: Москва
Зарегистрирован: 18.11.2022
Сообщений: 2

Re: Помогите составить SQL запрос по нескольким условиям

Привет!

Простите если не туда пишу, но я решила что эта ветка подходящая и не нужно создавать новую. У меня следующая проблема. Пытаюсь сделать меню.
Для этого мне нужно получить список категорий с сылками и описанием этих категорий. Две разные таблицы. Проблема в том, что я получила все нужные данные кроме ссылок на категории.

Запрос выглядит так:

return R::getAll("SELECT c.*, cd.* FROM cat c JOIN cat_desc cd ON c.id = cd.cat_parent WHERE c.cat_slug = ?", [$slug]);

Slug хранит в себе ссылку которая мне и нужна. Далее, в цикле, я передам ее каждому пункту меню.
Но я не могу получить ссылку из этого запроса, в этом и проблема. Можно ли как то добавить сюда еще cat_slug из таблицы с?
То есть, сейчас я передаю сюда слаг для формирования нужных мне данных. Но в итоге не могу получить этот слаг после формирования данных. В общем замкнутый круг.

Таблица -> cat

id  parent_id  cat_slug
1   0              слаг(ссылка на родительскую категорию)
2   0              слаг(ссылка на родительскую категорию)
3   1              слаг(ссылка которая мне нужна)
4   3              слаг(ссылка которая мне нужна)

//=================//

Таблица -> cat_desc

id  cat_parent  title
1   0                Название категории
2   0                Название категории
3   1                Название категории
4   3                Название категории
5   3                Название категории

Пожалуйста, помогите! Два дня уже мучаюсь и не могу ничего сделать.

Неактивен

 

#6 18.11.2022 13:02:31

estic
Участник
Зарегистрирован: 01.10.2022
Сообщений: 13

Re: Помогите составить SQL запрос по нескольким условиям

У вас символьные идентификаторы (слаги) хранятся в таблице категорий. В чем проблема?

Smela написал:

Две разные таблицы.

Вообще странно (по нынешним меркам) хранить названия отдельно от символьных идентификаторов. У пунктов меню могут быть немного отличные от названий соответствующих категорий названия. В этом случае в отдельную таблицу выносят и названия, и символьные идентификаторы. Пусть вас это не смущает - таблица меню полностью отвязывается от таблицы категорий, т.е. становится общей. В этом случае вместо символьных идентификаторов в ней можно хранить любые (не только для категорий) материальные пути, например 'about/me'. Если же и названия пунктов меню всегда совпадают с названиями соответствующих категорий, и таблица "частная", то логично просто строить меню на основе таблицы категорий.

Зачем в таблице описаний хранить поле для связи с родительской категорией? И зачем вообще нужна таблица описаний? Вы действительно храните названия/описания категорий отдельно от категорий? smile Или это все же таблица меню?

Вы не свое название добавляете к категории. Замените

Smela написал:

JOIN cat_desc cd ON c.id = cd.cat_parent

на LEFT JOIN `cat_desc` USING(`id`). И не нужно выбирать все поля присоединяемой таблицы. Достаточно title. При необходимости можно переименовать: `cat_desc`.`title` [AS] `cat_title` wink

Smela написал:

WHERE c.cat_slug = ?

При формировании меню не нужна выборка по символьному идентификатору. Такая выборка выполняется при маршрутизации, т.е. когда нужно вывести соответствующую страницу. Или когда меню выводится частями, т.е. при помощи AJAX отдельными разделами.

Отредактированно estic (18.11.2022 13:33:46)

Неактивен

 

#7 18.11.2022 14:42:25

Smela
Участник
Откуда: Москва
Зарегистрирован: 18.11.2022
Сообщений: 2

Re: Помогите составить SQL запрос по нескольким условиям

Благодарю Вас за ответ!

1.

на LEFT JOIN `cat_desc` USING(`id`)

Так я получаю только родительские категории у которых cat_parent и parent_id = 0 а не нужный мне список подкатегорий у которых cat_parent и parent_id = 2, 4, 3 и т.д.
Категории у которых cat_parent и parent_id = 0 формируют основное меню. А я пытаюсь получить данные у которых cat_parent и parent_id != 0, точнее уже получила но не могу передать им нужный cat_slug так как не могу его вытащить запросом, им присваивается cat_slug родительской категории, то есть тот у которой parent_id = 0.


2.

Вообще странно (по нынешним меркам) хранить названия отдельно от символьных идентификаторов.

Я только учусь, так что не бейте больно smile

Я наверное не очень понятно описала что именно мне нужно. Буду пробовать дальше, может что то получится.

Отредактированно Smela (18.11.2022 14:43:27)


Прикрепленные файлы:
Attachment Icon Без имени-1.jpg, Размер: 465,296 байт, Скачано: 6

Неактивен

 

#8 19.11.2022 11:26:23

estic
Участник
Зарегистрирован: 01.10.2022
Сообщений: 13

Re: Помогите составить SQL запрос по нескольким условиям

Smela написал:

а не нужный мне список подкатегорий

Так бы сразу и писали smile

С результатом более-менее разобрались. Теперь нужно разобраться с исходными данными. Неужели у вас нет в распоряжении числового идентификатора, что вы делаете выборку по символьному? Вариант AJAX с выборкой определенного раздела? smile И учтите, что когда делают выборку подкатегорий, в условии используют поле с родителем (все подкатегории одного уровня, если не брать в расчет другие ветви, - это те, у которых один родитель). А названия получайте тем способом, который я показал. Т.е. просто выбирайте подкатегории одного уровня по родителю, а потом, для получения названий подкатегорий, присоединяйте таблицу описаний по id. Вопрос о назначении поля для связи с родительской категорией в таблице описаний остается открытым. Также вы не подтвердили, что названия действительно нужно хранить в отдельной таблице. Проще поле title добавить в таблицу категорий и формировать меню исключительно на основе этой таблицы.

Посмотрел скриншот. Действительно вы разделили таблицу категорий на две части без каких-то видимых причин. Возможно, символьные идентификаторы позже добавили (но тогда почему таблица с ними называется cat?).

Отредактированно estic (19.11.2022 11:38:54)

Неактивен

 

#9 19.11.2022 11:54:57

estic
Участник
Зарегистрирован: 01.10.2022
Сообщений: 13

Re: Помогите составить SQL запрос по нескольким условиям

Еще такая подсказка: если у вас используются только подкатегории одного уровня (как в таблицах на скриншоте), их можно выбирать одним простым запросом сразу для всех родителей. И родителей тоже можно выбирать этим же запросом. Для удобства вывода просто используйте в запросе сортировку по родителю в первую очередь. Тогда в выборке подкатегории (и родительские категории, если они включены в выборку) будут сгруппированы удобным для вывода образом.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson