2014-11-10 3 views
1

У меня есть таблица для комментариев ("event_comments") на различные события со следующими столбцами:Попадая столбцы с одинаковыми именами из разных таблиц Mysql

  • POST_ID
  • event_id
  • имя пользователя
  • комментарий
  • дата

Я хочу, чтобы иметь возможность retrie ve эту информацию из базы данных, а также иметь возможность печатать имя пользователя, имя и фамилию; для этого я думал об использовании INNER JOIN, но он не работает по следующей причине: у меня есть 3 разных типа профиля (3 разных таблицы), «ученики», «опекуны», «учителя» и когда я пытаюсь использовать INNER ПРИСОЕДИНЯЙТЕ, используя «имя пользователя». Я получаю сообщение об ошибке, в котором указано, что поле «имя пользователя» из предложения неоднозначно.

SELECT event_comments.post_id, event_comments.event_id, event_comments.username, event_comments.comment, event_comments.date, 
students.first_name, students.last_name, students.picture, 
guardians.first_name, guardians.last_name, guardians.picture, 
teachers.first_name, teachers.last_name, teachers.picture 
FROM event_comments 
INNER JOIN students 
INNER JOIN guardians 
INNER JOIN teachers 
USING (username) 
ORDER BY date DESC 
LIMIT 20 

Я попытался сделать это, и он сработал, но он показывает только 1 комментарий для пользователя; если пользователь имеет более чем 1 комментарий, то информация игнорируется:

SELECT event_comments.post_id, event_comments.event_id, event_comments.username, event_comments.comment, event_comments.date, 
students.first_name, students.last_name, students.picture, 
guardians.first_name, guardians.last_name, guardians.picture, 
teachers.first_name, teachers.last_name, teachers.picture 
FROM event_comments 
INNER JOIN students 
INNER JOIN guardians 
INNER JOIN teachers 
GROUP BY username 
ORDER BY date DESC 
LIMIT 20 

ли кто-нибудь, как получить INNER JOIN и работать? есть ли лучший способ сделать то, что я хочу? Надеюсь, я хорошо себя объяснил.

Спасибо!

ответ

1

сделать это следующим образом:

SELECT event_comments.post_id, event_comments.event_id, event_comments.username, event_comments.comment, event_comments.date, 
    students.first_name, students.last_name, students.picture, 
    guardians.first_name, guardians.last_name, guardians.picture, 
    teachers.first_name, teachers.last_name, teachers.picture 
    FROM event_comments 
    INNER JOIN students 
    on event_comments.username=students.username 
    INNER JOIN guardians 
    on event_comments.username=guardians.username 
    INNER JOIN teachers 
    on event_comments.username=teachers.username 
    ORDER BY date DESC 
    LIMIT 20 

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

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

SELECT e.post_id, e.event_id, e.username, e.comment, e_comments.date, 
    s.first_name, s.last_name, s.picture 
    from event_comments e 
    inner join students s 
    on e.username=g.username 
UNION SELECT e.post_id, e.event_id, e.username, e.comment, e_comments.date, 
    g.first_name, g.last_name, g.picture 
    from event_comments e 
    inner join guardians g 
    on e.username=g.username 
UNION SELECT e.post_id, e.event_id, e.username, e.comment, e_comments.date, 
    t.first_name, t.last_name, t.picture 
    from event_comments e 
    inner join teacher t 
    on e.username=t.username 

EDIT: Чтобы лучше объяснить, о запросе он просто делает это простые шаги:

  1. Запрос все комментарии от студентов, использующих имя пользователя, чтобы присоединиться к студентам пост
  2. Запрос все комментарии опекунов, используя имя пользователя, чтобы присоединиться к пост опекунам
  3. запрос Все комментарии от учителей, используя имя пользователя, чтобы присоединиться к должности учителей
  4. Объединить результаты студентов, опекунов, учителей вместе
+0

Большое спасибо за ваш ответ. Это то, что я получаю: MySQL возвращает пустой набор результатов (т. Е. Нулевые строки). Это так запутанно. Я начинаю думать, что, возможно, невозможно сделать то, что я хочу сделать. – Rookie

+0

это почти то, что мне нужно. Большое спасибо. Я должен изучить ваш ответ, потому что он настолько сложный для новичка, как я. Я бы хотел опубликовать фотографию, чтобы вы могли видеть, что происходит ... Что происходит, так это то, что она показывает результаты дублирования, половина результатов хороша, а другая половина имеет «NULL» в следующих полях first_name , last_name и картинка ... Я пытаюсь понять, почему, но я не могу ... – Rookie

+0

Да, было бы лучше, если бы я мог видеть ваш результирующий набор, чтобы я мог понять, что случилось. Проблема, вероятно, в ваших данных – TheProvost

1

Вам нужен пункт using для каждой пары join с:

FROM event_comments INNER JOIN 
    students 
    USING (username) INNER JOIN 
    guardians 
    USING (username) INNER JOIN 
    teachers 
    USING (username) 

В MySQL inner join, не on пункта трактуется как cross join. В других базах данных для inner join требуется условие on или using.

+0

Запрос работает, но это то, что я получаю: MySQL возвратил набор пустой результат (т.е. нулевые строки) – Rookie

+0

@Rookie затем сделать их левыми соединениями ..так как вы отфильтровываете все строки –

+0

@Rookie. , , Тогда 'username' не является правильным ключом соединения для таблиц. Вам нужно использовать правильный ключ. –

Смежные вопросы