NB. Я отметил это с помощью SQLAlchemy и Python, потому что суть вопроса заключалась в том, чтобы разработать запрос для преобразования в SQLAlchemy.Это ясно в ответе, который я отправил.Это также применимо к MySQL.
У меня есть три взаимосвязанные таблицы, которые я использую для описания книги.(В приведенных ниже описаниях таблиц я исключил посторонние строки в данном вопросе.)
MariaDB [icc]> describe edition;
+-----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
+-----------+------------+------+-----+---------+----------------+
7 rows in set (0.001 sec)
MariaDB [icc]> describe line;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| edition_id | int(11) | YES | MUL | NULL | |
| line | varchar(200) | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
5 rows in set (0.001 sec)
MariaDB [icc]> describe line_attribute;
+------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| line_id | int(11) | NO | PRI | NULL | |
| num | int(11) | YES | | NULL | |
| precedence | int(11) | YES | MUL | NULL | |
| primary | tinyint(1) | NO | MUL | NULL | |
+------------+------------+------+-----+---------+-------+
5 rows in set (0.001 sec)
line_attribute.precedence
- это иерархический уровень данного заголовка.Таким образом, если «Война и мир» имеют «Книги»> «Главы», все строки имеют атрибут, соответствующий книге, в которой они находятся (например, «Книга 1» имеет precedence=1
и num=1
), и атрибут главы, в которой они находятся(например, глава 2 имеет precedence=2
и num=2
).Это позволяет мне переводить иерархическую структуру книг с томами, книгами, частями, главами, разделами или даже актами и сценами.Первичный столбец является логическим, поэтому каждая строка имеет атрибут one , который является первичным.Если это заголовок книги, это атрибут Book
, если это заголовок главы, это атрибут Chapter
.Если это обычная строка в тексте, это атрибут line
, и приоритет равен 0, поскольку он не является частью иерархической структуры.
Мне нужно иметь возможность запрашивать все строки сконкретный edition_id
, который также имеет пересечение двух атрибутов line_attributes.
(Это позволило бы мне получить все строки из определенного издания, скажем, в Книге 1, Глава 2 «Война и мир»).
Я могу получить все строки с Книгой 1 с помощью
SELECT
line.*
FROM
line
INNER JOIN
line_attribute
ON
line_attribute.line_id=line.id
WHERE
line.edition_id=2 AND line_attribute.precedence=1 AND line_attribute.num=1;
и получить все строки с Главой 2:
SELECT
line.*
FROM
line
INNER JOIN
line_attribute
ON
line_attribute.line_id=line.id
WHERE
line.edition_id=2 AND line_attribute.precedence=2 AND line_attribute.num=1;
За исключением возврата второго запросакаждая глава 2 из каждой книги «Война и мир».
Как мне получить из этих двух запросов всего строк из книги 1 главы 2?