Объединение таблиц в SQL - PullRequest
2 голосов
/ 28 июня 2010

У меня проблемы с запросом SQL.

SELECT t.topicname, m. *, ms.avatar
   FROM `messages` m
    INNER JOIN topics t ON m.topicid = t.topicid
    inner join users u on m.author=u.username
    inner join misc ms on u.userid=ms.userid
   ORDER BY postdate DESC LIMIT 5

что я хочу сделать, это получить имя темы из таблицы тем, все из таблицы сообщений и аватар из таблицы misc

Присоединяюсь к таблице тем и сообщений по themeid Я могу присоединиться к таблице сообщений и пользователей с помощью messages.author и users.username и присоединиться к таблице misc, к которой присоединяюсь к users.userid и misc.userid

Проблема в том, что я не получаю желаемых результатов

Этот запрос работает с объединенными таблицами сообщений и тем, но мне нужно добавить таблицу misc, и единственный способ присоединиться через таблицу пользователей

SELECT t.topicname, m. *
   FROM `messages` m
    INNER JOIN topics t ON m.topicid = t.topicid
    ORDER BY postdate DESC LIMIT 5

Вот структура таблицы

CREATE TABLE `messages` (
  `messageid` int(6) NOT NULL auto_increment,
  `boardid` int(2) NOT NULL default '0',
  `topicid` int(4) NOT NULL default '0',
  `message` text NOT NULL,
  `author` varchar(255) NOT NULL default '',
  `postdate` datetime default NULL,
  PRIMARY KEY  (`messageid`)
)

CREATE TABLE `misc` (
  `miscid` int(4) NOT NULL auto_increment,
  `userid` int(4) NOT NULL default '0',
  `profpic` varchar(100) NOT NULL default '',
  `avatar` varchar(100) NOT NULL default '',
  `signature` text NOT NULL,
  `alerts` enum('y','n') NOT NULL default 'y',
  PRIMARY KEY  (`miscid`)
)

CREATE TABLE `topics` (
  `topicid` int(4) NOT NULL auto_increment,
  `boardid` int(2) NOT NULL default '0',
  `topicname` varchar(255) NOT NULL default '',
  `author` varchar(255) NOT NULL default '',
  `counter` int(5) NOT NULL default '0',
  `sticky` char(1) NOT NULL default 'n',
  `locked` char(1) NOT NULL default 'n',
  PRIMARY KEY  (`topicid`)
)

CREATE TABLE `users` (
  `userid` int(25) NOT NULL auto_increment,
  `first_name` varchar(25) NOT NULL default '',
  `last_name` varchar(25) NOT NULL default '',
  `email` varchar(255) NOT NULL default '',
  `username` varchar(25) NOT NULL default '',
  PRIMARY KEY  (`userid`)
)

Это результат запроса только с двумя объединениями, и это то, что я ожидаю получить (только я хочу иметь аватар с ним)

Здесь не очень красиво, но именно это дает мне база данных

topicname         messageid       boardid         topicid         message         author      postdate
Mauris Eu Neque Ipsum   36  4   8   Suspendisse nibh risus, porta at cursus sed, tinci...   iTuneStinker    2010-04-08 20:31:39
Aliquam Erat Volutpat   35  5   15  Donec volutpat ligula eu lorem pharetra a adipisci...   AwsomeMoon  2010-04-07 21:58:20
Ut Non Risus Elit   34  2   14  Etiam cursus, erat sed placerat fringilla, risus a...   ScaryHair   2010-04-07 15:35:34
Quisque Rutrum Mattis Sagittis  33  5   9   Etiam in elit sit amet nulla scelerisque ultricies...   ScaryHair   2010-04-07 15:33:46
Where Do I Start Trying To Organise A Festival  32  3   12  Morbi a neque aliquam nisl varius lobortis. Sed ve...   ScaryHair   2010-04-07 13:27:40

и вот результат с использованием запроса, объединяющего все таблицы

topicname         messageid       boardid         topicid         message         author      postdate        avatar
Forum Rules And Guidelines  2   1   1   FORUM RULES     AdRock  2009-04-11 23:05:18     avatar_17200.jpg
Forum Rules And Guidelines  3   2   2   FORUM RULES.    AdRock  2009-04-11 23:05:18     avatar_17200.jpg
Forum Rules And Guidelines  4   3   3   FORUM RULES     AdRock  2009-04-11 23:05:18     avatar_17200.jpg
Forum Rules And Guidelines  5   4   4   FORUM RULES     AdRock  2009-04-11 23:05:18     avatar_17200.jpg
Forum Rules And Guidelines  6   5   5   FORUM RULES     AdRock  2009-04-11 23:05:18     avatar_17200.jpg

Первый запрос получает последние 5 записей таблицы сообщений, и это то, что я хочу, но я хочу иметь возможность получить аватар, относящийся к автору каждого сообщения

1 Ответ

2 голосов
/ 28 июня 2010

Похоже, у вас нет пользователей и аватаров, заполненных для каждого сообщения.

Попробуйте заменить INNER JOINS на OUTER JOINS.

SELECT  t.topicname, m. *, ms.avatar
FROM    `messages` m
JOIN    topics t
ON      t.topicid = m.topicid
LEFT JOIN
        users u
ON      u.username = m.author
LEFT JOIN
        misc ms
ON      ms.userid = u.userid
ORDER BY
        m.postdate DESC
LIMIT 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...