Я пытаюсь структурировать SQL-запрос со сложной вложенной операцией select!
Мой исходный SQL-запрос успешно объединяет около 30 таблиц, данные извлекаются по желанию! Однако каждая взятая запись в 30 таблицах имеет много записей в другой таблице (Комментарии)! То, что я хочу сделать, - это присвоить каждой записи в таблице (Таблица комментариев) ее записи в других 30 таблицах по идентификаторам и получить их все вместе в одном запросе. Однако это не единственная проблема, некоторые из 30 таблиц содержат помимо записей в таблице "Комментарии" больше записей в другой таблице (extras), поэтому я ищу дополнительный подзапрос в основном подзапросе в LEFT JOIN внутри основной запрос внешнего запроса.
Сделать идею более ясной; без подзапроса скрипт будет выглядеть следующим образом:
$query = $mysqli->query("
SELECT
parent1.parent1_id,
parent1.child1_id,
parent1.child2_id,
parent1.child3_id,
parent2.parent2_id,
parent2.child1_id,
parent2.child2_id,
parent2.child3_id,
child1.child1_id,
child1.child1_content,
child2.child2_id,
child2.child2_content,
child3.child3_id,
child3.child3_content
FROM
parent1
LEFT JOIN child1
ON child1.child1_id = parent1.child1_id
LEFT JOIN child2
ON child2.child2_id = parent1.child2_id
LEFT JOIN child3
ON child3.child3_id = parent1.child3_id
LEFT JOIN followers
ON parent1.user_id = followers.followed_id
AND parent1.parent1_timestamp > followers.followed_timestamp
AND parent1.parent1_id NOT IN (SELECT removed.isub_rmv FROM removed)
AND parent1.parent1_hide = false
WHERE
followers.follower_id = {$_SESSION['info']}
{$portname_clause}
ORDER BY
parent1.parent1_timestamp DESC
LIMIT
{$postnumbers}
OFFSET
{$offset}
")
// Now fetching and looping through the retrieved data
while($row = $query->fetch_assoc()){
echo $row['child1_content'];
$subquery1 = $mysqli->query("SELECT extras.child1_id,
extras.extrasContent FROM extras WHERE extras.child1_id =
{$row['child1_id']}");
while($row1 = $subquery1->fetch_assoc()){
echo $row1['extrasContent'];
}
echo $row['child2_content'];
$subquery2 = $mysqli->query("SELECT extras.child2_id,
extras.extrasContent FROM extras WHERE extras.child2_id =
{$row['child2_id']}");
while($row2 = $subquery2->fetch_assoc()){
echo $row2['extrasContent'];
}
echo $row['child3_content'];
$subquery3 = $mysqli->query("SELECT extras.child3_id,
extras.extrasContent FROM extras WHERE extras.child3_id =
{$row['child3_id']}");
while($row3 = $subquery3->fetch_assoc()){
echo $row3['extrasContent'];
// Here i need to run additional query inside the subquery 3 to retrieve the (Comments table) data beside (extras table)
$subquery4 = $mysqli->query("SELECT comments.comment_id, comments.comment FROM comments WHERE comments.child3_id = {$row['child3_id']} OR comments.child3_id = {$row3['child3_id']}");
while($row4 = $subquery4->fetch_assoc()){
echo $row4['comment'];
}
}
} // No sane person would make such code
Поскольку вышеприведенный код был бы полностью передовым, я искал лучший способ его выполнить, и вот где я столкнулся с концепцией подзапроса, но я ничего не знаю о подзапросах, и вскоре после того, как я его изучил, я придумал эту беспорядочную код, проверьте его ниже!
Я не размещаю код origianl здесь, потому что он слишком длинный, я включаю в себя виртуальный пример таблиц, к которым я хочу применить запрос, чтобы продемонстрировать этот процесс.
SELECT
parent1.parent1_id,
parent1.child1_id,
parent1.child2_id,
parent1.child3_id,
parent2.parent2_id,
parent2.child1_id,
parent2.child2_id,
parent2.child3_id
FROM
parent1
LEFT JOIN
( SELECT
child1.child1_id,
child1.child1_content
FROM
child1
WHERE
child1.child1_id = parent1.child1_id ) child1
( SELECT extras.extrasID, extras.extrasContent
FROM
extras
WHERE
extras.child1_id = child1.child1_id )
ON parent1.child1_id = child1.child1_id
LEFT JOIN child2
( SELECT
child2.child2_id,
child2.child2_content
FROM
child2
WHERE
child2.child2_id = parent1.child2_id )
( SELECT
extras.extrasID,
extras.extrasContent
FROM
extras
WHERE
extras.child2_id = child2.child2_id )
ON parent1.child2_id = child2.child2_id
LEFT JOIN child3
( SELECT
child3.child3_id,
child3.child3_content
FROM
child3
WHERE
child3.child3_id = parent1.child3_id )
( SELECT
extras.extrasID,
extras.extrasContent
FROM
( SELECT
comments.comment_id,
comments.comment
FROM
comments
WHERE
comments.child3_id = extras.child3_id ) extras
JOIN child3
ON extras.child3_id = child3.child3_id )
ON parent1.child3_id = child3.child3_id
LEFT JOIN followers
ON parent1.user_id = followers.followed_id
AND parent1.parent1_timestamp > followers.follower_timestamp
AND parent1.parent1_id NOT IN (SELECT removed.isub_rmv FROM removed)
AND parent1.parent1_hide = false
WHERE
followers.follower_id = {$_SESSION['info']}
{$portname_clause}
ORDER BY
parent1.parent1_timestamp DESC
LIMIT
{$postnumbers}
OFFSET
{$offset} // <-- Sorry for the bad code formatting!
Я использую MySql 5.6.37
Я еще не понял концепцию подзапроса, честно говоря, я потерялся и смутился, когда изучал его, и по другой причине, упомянутой в примечании ниже.
Примечание. Я заранее извиняюсь за то, что я не могу быть на мгновенном ответе, потому что там, где я живу, нет никакой электросети или ADSL или телефонов, и мой USB-модем вряд ли получит сигнал, у меня есть только два часа после трех часов в день electericity, генерируемых генератор desil. я перезаряжаю свой ноутбук и проверяю Интернет, а оставшиеся два часа - на другую жизнь. Я знаю, что шутка на мне, поскольку я разрабатываю веб-проект без электричества или постоянного Интернета. НО ЖИЗНЬ НЕ ДАЕТ ВСЕ! лол.
Вот как я решил проблему!
SELECT
parent1.parent1_id,
parent1.child1_id,
child1.child1_id,
child1.child1_content,
comments.comment_id,
comments.comment,
comments.child1_id
FROM parent1 LEFT JOIN
(
SELECT comments.comment_id, comments.comment, comments.child1_id
FROM
(
SELECT comments.comment_id,comments. comment, comments.child1_id
FROM comments
) comments JOIN child1
ON comments.child1_id = child1.child1_id
) comments
ON child1.child1_id = comments.
Ему нужны некоторые псевдонимы, и тогда хорошо идти.
) child1 ( SELECT extras
- первая ошибка. Сначала исправьте ее.