PHP Вывод данных из 2 таблиц с 3 объединениями - PullRequest
3 голосов
/ 04 апреля 2020

надеюсь, что вы можете помочь,

У меня есть 3 таблицы
article
article_keywords_link
ключевые слова

Они объединены, и я хочу получить 1 статью для отображения на странице, но показать все связанные ключевые слова, которые связаны со статьей.

Я еще не отформатировал эту страницу, я просто пытаюсь заставить функционировать работать.

SELECT article.article_id, article.article_title, article.article_content, keywords.keyword_name
FROM article
JOIN article_keyword_link ON article.article_id = article_keyword_link.article_id
INNER JOIN keywords ON article_keyword_link.keyword_id = keywords.keyword_id

Запустив вышеуказанный запрос в Phpmyadmin, я получаю эти результаты

Query Output from PhpmyAdmin
+------------+---------------+-------------------+--------------+
| article_id | article_title |  article_content  | keyword_name |
+------------+---------------+-------------------+--------------+
|          1 | Article 1     | Article 1 content | CCU          |
|          1 | Article 1     | Article 1 content | WIFI         |
|          1 | Article 1     | Article 1 content | Network      |
|          2 | Article 2     | Article 2 content | Passenger    |
|          2 | Article 2     | Article 2 content | Application  |
+------------+---------------+-------------------+--------------+

Вот как заполняются таблицы

Table: article
+------------+---------------+-------------------+
| article_id | article_title |  article_content  |
+------------+---------------+-------------------+
|          1 | Article 1     | Article 1 content |
|          2 | Article 2     | Article 2 content |
+------------+---------------+-------------------+
Table: article_keywords_link
+------------+------------+
| article_id | keyword_id |
+------------+------------+
|          1 |          1 |
|          1 |          2 |
|          2 |          3 |
|          2 |          4 |
|          1 |          7 |
+------------+------------+
Table: keywords
+------------+--------------+
| keyword_id | keyword_name |
+------------+--------------+
|          1 | CCU          |
|          2 | WIFI         |
|          3 | Passenger    |
|          4 | Application  |
|          5 | Software     |
|          6 | Hardware     |
|          7 | Network      |
+------------+--------------+

Источник страницы:

<?php

include 'includes/db.php';

// Create connection
$conn = new mysqli($host, $username, $password, $database);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "

SELECT article.article_id, article.article_title, article.article_content, keywords.keyword_name
FROM article
JOIN article_keyword_link ON article.article_id = article_keyword_link.article_id
INNER JOIN keywords ON article_keyword_link.keyword_id = keywords.keyword_id

";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        echo "Article ID: " . $row["article_id"] . "<br>";
        echo "Article Title: " . $row["article_title"] . "<br>";
        echo "Article Content: " . $row["article_content"] . "<br>"
;
    }
} else {
    echo "0 results";
}
$conn->close();
?>

Вывод страницы:

Article ID: 1
Article Title: Article 1
Article Content: Article 1 content
Article ID: 1
Article Title: Article 1
Article Content: Article 1 content
Article ID: 1
Article Title: Article 1
Article Content: Article 1 content
Article ID: 2
Article Title: Article 2
Article Content: Article 2 content
Article ID: 2
Article Title: Article 2
Article Content: Article 2 content

Итак, у меня есть две проблемы.
1. Как я могу получить только одну статью для отображения на странице, показывая все ключевые слова, относящиеся к этой статье?
2. Как настроить исходный код для отображения ключевых слов? если я добавлю новое эхо в l oop для ключевого слова_имя, страница не загрузится.

Любая помощь с этим будет принята с благодарностью

1 Ответ

2 голосов
/ 04 апреля 2020

Вы почти у цели, попробуйте это.

SELECT article.article_id, article.article_title, article.article_content, group_concat(keywords.keyword_name) as keywords
FROM article
JOIN article_keyword_link ON article.article_id = article_keyword_link.article_id
INNER JOIN keywords ON article_keyword_link.keyword_id = keywords.keyword_id
GROUP BY article.article_id

для получения информации о функциях, используемых для достижения этой цели. см.

https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html

Кроме того, если вам нужна только одна статья, вы добавляете limit 1 в конец запроса. и если вы хотите самый новый / самый старый, вы бы добавили ORDER BY article_id DESC LIMIT 1 для самых новых и ORDER BY article_id ASC LIMIT 1 для самых старых

...