Как получить две строки результата из одной строки таблицы

76
9

У меня есть следующий запрос MYSQL:

<?php

require "gospel_connect.php";

if(isset($_GET["keywords"])) {
$keywords = $db->escape_string($_GET["keywords"]);
$query = $db->query("SELECT *,
CASE
WHEN scriptures LIKE '%{$keywords}%' THEN scriptures_link
WHEN books LIKE '%{$keywords}%' THEN books_link
END as the_link
FROM data WHERE scriptures LIKE '%{$keywords}%' OR books LIKE '%{$keywords}%'");

?>

<div class='result-count'>
Found <?php echo $query->num_rows; ?> results.
</div>
<?php

if($query->num_rows) {
while($r = $query->fetch_object()) {
?>
<div class='result'>
<?php
$link = $r->the_link;

echo "<a href='$link'> Hi </a> <br>";
?>
</div>
<?php
}
}

}

Позвольте мне объяснить, запрос выполняет поиск из data таблицы db и имеет следующие столбцы: id, date, scriptures, books, scriptures_link, books_link.

Теперь запрос работает отлично. Он возвращает соответствующую ссылку. Проблема в том, что если оба scriptures и books соответствуют ключевым словам, будет показан только один результат. Я хочу, чтобы оба появлялись, если у обоих есть совпадения. В противном случае я хочу, чтобы один набор возвращал информацию. Как я могу это сделать?

спросил(а) 2016-08-14T02:03:00+03:00 4 года, 8 месяцев назад
1
Решение
62

Проблема в том, что вы хотите, чтобы две строки были возвращены из одной строки в таблице базы данных. В вашем случае вы должны использовать UNION ALL для получения желаемого результата:

SELECT *, scriptures_link AS the_link
FROM data WHERE scriptures LIKE '%{$keywords}%'
UNION ALL
SELECT *, books_link AS the_link
FROM data WHERE books LIKE '%{$keywords}%'

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

ответил(а) 2016-08-14T08:43:00+03:00 4 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема