сложный запрос

  • Автор темы MARY00
  • 57
  • Обновлено
  • 13, May 2024
  • #1
Кажется, я смогу сделать это одним запросом, но не могу разобраться в синтаксисе. Мой сайт занимается продажей книг.

В этом разделе я настраиваю страницы, на которых перечислены книги, отсортированные по ключевым словам.

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

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

У меня есть три соответствующие таблицы:
 books
— это таблица, содержащая большую часть информации о каждом названии.

Первичный ключ —
 isbn
.
 remove
отслеживает, какие заголовки больше не доступны.

Поля: id (ключ), isbn и day2go. Если запись в «книгах» не имеет записи в «удалить», это название доступно. «topicLU» — это таблица поиска, соединяющая таблицу «темы» с «книгами». Поля: «id» (ключ), «isbn» и «topicid». Для этого запроса у нас есть значение themeLU.topicid.

Назовите это $topicid.

Мне нужен список книг, которые имеют общее поле isbn с полем «topicLU», но не находятся в списке «удалить». Я мог бы сделать это с помощью двух запросов и цикла, но, похоже, я смогу сделать это с помощью левого соединения. заранее спасибо...

MARY00


Рег
01 Jan, 2011

Тем
1

Постов
1

Баллов
11
  • 18, May 2024
  • #2
Круто.

Для повышения производительности я решил добавить поле «активно» в таблицу «темы». Таким образом, сложный запрос может быть выполнен в скрытом скрипте обновления, который устанавливает значение «активный» и который я могу запускать, когда в доступных книгах или тегах происходят изменения.

Как я изначально задумывал, сложный запрос должен был проверять каждую тему, чтобы увидеть, активна ли она на общедоступной странице, на которой перечислены все [активные] темы.

Поскольку книги добавляются или удаляются нечасто, кажется гораздо более эффективным добавить простой WHERE
 active
= 'yes' к запросу на общедоступной странице.
 

asja1


Рег
09 Jul, 2010

Тем
0

Постов
4

Баллов
4
  • 03, Jun 2024
  • #3
Я немного спешил... Я создал скрипт, а затем сайт разбился, но это то, что у меня было для схемы
 select books.title, books.isbn, topicLU.topicid, topic.topic, count(tlu2.id) as `check`

from `books`

inner join topicLU on books.isbn = topicLU.isbn

inner join topic on topicLU.topicid = topic.id

inner join topicLU as tlu2 on topic.id = tlu2.topicid

where not exists (select remove.id from `remove` where remove.isbn = books.isbn)

group by books.isbn, topic.topic

order by books.isbn

having `check` >= 2
Код (разметка): и я создал запрос, который выглядел примерно так, но этот запрос не проверяет, нет ли двух заголовков, имеющих определенную тему, в списке удаления.
 CREATE TABLE `books`( `isbn` INT(11) NOT NULL AUTO_INCREMENT, `title` VARCHAR(150), PRIMARY KEY (`isbn`) ); CREATE TABLE `remove`( `id` INT(11) NOT NULL AUTO_INCREMENT, `isbn` int(11), day2go DATETIME, PRIMARY KEY (`id`) ); CREATE TABLE `topicLU`( `id` INT(11) NOT NULL AUTO_INCREMENT, `isbn` int(11), topicid int(11), PRIMARY KEY (`id`) ); CREATE TABLE `topic`( `id` INT(11) NOT NULL AUTO_INCREMENT, `topic` VARCHAR(150), PRIMARY KEY (`id`) ); insert into `books` values (1000, 'Clean & Lean') , (1001, 'Where the crawdads sing') , (1002, 'Life will be the death of me') , (1003,'Becoming Michelle Obama') , (1004, 'Diary of an Awesome Friendly Kid') , (1005, 'Wolfpack') , (1006, 'Girl Stop Apologising'); insert into `remove` values (1, 1004, now()); insert into `topic` values (1, 'Youth'), (2,'Biography'), (3,'Fiction'), (4, 'Self Help'), (5,'Health'); insert into `topicLU` values (1, 1000, 5) , (2, 1000, 4) , (3, 1006, 4) , (4, 1001, 3) , (5, 1003, 2) , (6, 1004, 1) , (7, 1005, 4);
Код (разметка):
 

hxn


Рег
28 Nov, 2012

Тем
1

Постов
2

Баллов
12
  • 08, Jun 2024
  • #4
Необходим ли последний оператор существования? Кажется, вы могли бы настроить оператор соединения, а затем использовать предложениеwhere в основном запросе, чтобы вообще избежать второго вложенного запроса.

Чем меньше вложенных запросов, тем лучше.

Они создают массу накладных расходов, и их следует избегать, когда это возможно.
 

artemfcsh1


Рег
07 Feb, 2013

Тем
1

Постов
3

Баллов
13
  • 11, Jun 2024
  • #5
 select books.title, books.isbn, topicLU.topicid, topic.topic

from `books`

inner join topicLU on books.isbn = topicLU.isbn

inner join topic on topicLU.topicid = topicLU.topicid

where not exists (select remove.id from `remove` where remove.isbn = books.isbn)

and exists (select tlu2.topicid, count(b2.isbn) as counter from topicLU as tlu2 inner join books as b2 on tlu2.isbn = b2.isbn group by tlu2.topicid where topicLU.topicid = tlu2.topicid order by tlu2.topicid having counter > 2)
Code (markup): untested, obviously, and I'm racing out the door. If you want to give us a sql fiddle we'll be able to help you write the query properly and test it. http://sqlfiddle.com/

It takes a bit to set it up but well worth going through the process.
 

miratext


Рег
21 Jan, 2014

Тем
1

Постов
5

Баллов
15
Тем
49554
Комментарии
57426
Опыт
552966

Интересно