MySQL Join. Объединение нескольких строк из одной таблицы в другую? - PullRequest
0 голосов
/ 25 декабря 2011

У меня есть таблица с именем Articles.У меня также есть стол для Tags.Таблица тегов на самом деле имеет 2 отдельные таблицы, так как она имеет отношение многие ко многим между статьями и тегами.Например:

CREATE TABLE Articles (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT
    title VARCHAR(255),
    author INT UNSIGNED NOT NULL,
    body TEXT NOT NULL -- column type may not be representative
) Engine=InnoDB;

CREATE TABLE Tags (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(32)
) Engine=InnoDB;

CREATE TABLE Article_Tags (
    article INT UNSIGNED NOT NULL,
    tag INT UNSIGNED NOT NULL,
    FOREIGN KEY (article) REFERENCES Articles (id),
    FOREIGN KEY (tag) REFERENCES Tags (id)
) Engine=InnoDB;

Теперь можно ли выполнить один запрос для возврата статьи, а также все теги, связанные с этой статьей, из таблицы тегов в одном запросе?

Ответы [ 2 ]

1 голос
/ 25 декабря 2011

Вам нужно использовать агрегатную функцию для объединения тегов, если вы хотите получить обратно только одну строку.

Предполагая, что article имеет (id, title, content), tag имеет (id, name), а article_tags (таблица соединений) имеет (tag_id, article_id), тогда что-то подобное должно это сделать (очевидно, не проверено):

SELECT a.title,
       a.content,
       GROUP_CONCAT(
        DISTINCT t.name 
        ORDER BY ASC
        SEPARATOR ", "
      ) as tags
FROM article a
INNER JOIN article_tags at ON at.article_id = a.id
INNER JOIN tag t ON t.id = at.tag_id
GROUP BY a.id
0 голосов
/ 25 декабря 2011

Согласно комментариям, вы обычно используете оператор JOIN для объединения связанных записей из нескольких таблиц.

Обратите внимание, что я предполагаю, что

  • Articles имеет ID столбец
  • Article_Tags имеет столбцы ArticleID и TagID
  • Tags имеет столбец ID

Если фактические имена столбцов отличаются, вы должны заменить соответствующие столбцы в моем утверждении их действительными именами.

Оператор SQL

SELECT *
FROM   Articles a
       INNER JOIN Article_Tags at ON at.ArticleID = a.ID
       INNER JOIN Tags t ON t.ID = at.TagID

Дополнительная информация о синтаксисе JOIN

Соединения SQL используются для запроса данных из двух или более таблиц на основе связь между определенными столбцами в этих таблицах

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