2015-05-10 3 views
1

У меня есть две таблицы complaints и в моей базе данных MySQl. Пользователи могут добавлять жалобы, которые хранятся в жалобах, ответы на жалобы хранятся в таблице жалоб. Я пытаюсь ПРИСОЕДИНИТЬСЯ к указанному содержимому таблицы в определенном состоянии. Прежде чем упомянуть о том, что я пытаюсь получить, и о проблеме, с которой я столкнулся, я сначала объясню структуру этих двух таблиц.JOIN query в MySQL дает неправильный результат

NB: Лицо, добавляющее жалобы, является владельцем жалобы &. Владелец жалобы также может добавлять ответы. Таким образом, он может быть либо владельцем жалобы, либо ответчиком жалобы. Две таблицы имеют отношения «один ко многим». В жалобе может быть более одного ответа на жалобу. member_id в complaint таблице представляет владелец жалобы & mem_id в представляет жалобы replier

ХОЧЕТ ВЫХОД: Соедините две таблицы и получать значения и показать жалобу и ответ жалобы в качестве одного набора результатов. Но это состояние непросто. Последний добавленный ответ на жалобу от таблицы complaints_reply должен быть получен для жалобы в таблице жалоб таким образом, чтобы владелец жалобы не должен был отвечать на жалобу. Я использую posted_date & posted_time от стол для получения последней добавленной жалобы ответ на жалобу &, что ответчик жалобы должен быть указан в результирующем наборе.

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

+------+---------+----------+-------------+-------------------+ 
| id | title |member_id |last_replier |last_posted_dt  | 
+------+---------+----------+-------------+-------------------+ 
| 1 | x  | 1000  |2002   | 2015-05-2610:11:17| 
| 2 | y  | 1001  |1000   | 2015-05-2710:06:16| 
+------+---------+----------+-------------+-------------------+ 

Но то, что я получил это:

+------+---------+----------+-------------+-------------------+ 
| id | title |member_id |last_replier |last_posted_dt  | 
+------+---------+----------+-------------+-------------------+ 
| 1 | x  | 1000  |1001   | 2015-05-2610:11:17| 
| 2 | y  | 1001  |2000   | 2015-05-2710:06:16| 
+------+---------+----------+-------------+-------------------+ 

дата верна, но возвращенный ответчик жалобы last_replier неправ.

Это мой вопрос.Структура

SELECT com.id, 
     com.title, 
     com.member_id, 
     last_comp_reply.last_replier, 
     last_comp_reply.last_posted_dt 
FROM complaints com 
LEFT JOIN 
    (SELECT c.id AS complaint_id, 
      c.member_id AS parent_mem_id, 
      cr.mem_id AS last_replier, 
      max(cr.posted_dt) AS last_posted_dt 
    FROM 
    (SELECT cr.complaint_id,cr.mem_id,c.id,c.member_id,(CONCAT(cr.posted_date,cr.posted_time)) AS posted_dt 
     FROM complaints_reply cr, 
      complaints c 
     WHERE cr.complaint_id=c.id 
     AND cr.mem_id!=c.member_id 
     GROUP BY cr.complaint_id, 
       cr.mem_id, 
       posted_dt)cr, 
     complaints c 
    WHERE cr.complaint_id=c.id 
    GROUP BY cr.complaint_id, 
      c.id, 
      c.member_id) AS last_comp_reply ON com.id=last_comp_reply.complaint_id 

Стол для таблицы complaints

CREATE TABLE IF NOT EXISTS `complaints` (
    `id` int(11) NOT NULL, 
    `title` varchar(500) NOT NULL, 
    `member_id` int(11) NOT NULL, 
    `posted_date` date NOT NULL, 
    `posted_time` time NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 

Индексы для таблицы complaints

ALTER TABLE `complaints` 
ADD PRIMARY KEY (`id`); 

AUTO_INCREMENT для таблицы complaints

ALTER TABLE `complaints` 
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=3; 

выгрузка данных для таблицы complaints

INSERT INTO `complaints` (`id`, `title`, `member_id`, `posted_date`, `posted_time`) VALUES 
(1, 'x', 1000, '2015-05-05', '02:06:15'), 
(2, 'y', 1001, '2015-05-14', '02:08:10'); 

Структура таблицы для таблицы

CREATE TABLE IF NOT EXISTS `complaints_reply` (
`id` int(11) NOT NULL, 
    `complaint_id` int(11) NOT NULL, 
    `comments` text NOT NULL, 
    `mem_id` int(11) NOT NULL, 
    `posted_date` date NOT NULL, 
    `posted_time` time NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ; 

Индексы для таблицы

ALTER TABLE `complaints_reply` 
ADD PRIMARY KEY (`id`); 

AUTO_INCREMENT для таблицы

ALTER TABLE `complaints_reply` 
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=10; 

самосвальные данные таблицы

INSERT INTO `complaints_reply` (`id`, `complaint_id`, `comments`, `mem_id`, `posted_date`, `posted_time`) VALUES 
(1, 1, 'reply1', 2000, '2015-05-08', '02:07:08'), 
(2, 1, 'reply2', 2001, '2015-05-06', '06:05:08'), 
(3, 1, 'reply3', 1000, '2015-05-14', '02:12:13'), 
(4, 2, 'hola', 1000, '2015-05-27', '10:06:16'), 
(5, 2, 'hello', 2000, '2015-05-04', '03:09:09'), 
(6, 2, 'gracias', 1001, '2015-05-31', '06:12:18'), 
(7, 1, 'reply4', 1001, '2015-01-04', '04:08:12'), 
(8, 2, 'puta', 1001, '2015-06-13', '06:12:18'), 
(9, 1, 'reply5', 1000, '2015-06-01', '04:08:12'), 
(10, 1, 'reply next', 2002, '2015-05-26', '10:11:17'); 

P.S.

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

SELECT cr.complaint_id, 
     cr.mem_id, 
     c.id, 
     c.member_id, 
     (CONCAT(cr.posted_date,cr.posted_time)) AS posted_dt 
FROM complaints_reply cr, 
    complaints c 
WHERE cr.complaint_id=c.id 
    AND cr.mem_id!=c.member_id 
GROUP BY cr.complaint_id, 
     cr.mem_id, 
     posted_dt 

и результат для этого:

member_id здесь представляет владельца жалобы и mem_id представляет жалобу replier

Внутренний запрос дает результат, основанный на условии, а затем все после этого происходит с haywire. Я не знаю, где я ошибся. Ответные жалобы, добавленные владельцем жалобы, не получены в этой таблице. Все идет нормально. Есть ли альтернативный способ получить результат?

+0

вопрос стороны - почему вы делаете 'ALTER TABLE', чтобы сделать свой« ПЕРВЫЙ КЛЮЧ »/' Index' и 'AUTO_INCREMENT'? Почему бы просто не сделать это в объявлении таблицы? – Sean

+0

http://dba.stackexchange.com/questions/101111/mysql-join-query-produces-wrong-result/101114#101114 –

ответ

0

Этот запрос дает результат.

SELECT com.id AS complaint_id, 
     com.member_id AS parent_mem_id, 
     crep.mem_id AS last_replier, 
     crl.last_posted_dt 
FROM complaints com 
LEFT JOIN complaints_reply crep ON com.id=crep.complaint_id 
JOIN 
    (SELECT cr.complaint_id, 
      max(CONCAT(cr.posted_date,'_',cr.posted_time)) AS last_posted_dt 
    FROM complaints_reply cr, 
     complaints c 
    WHERE cr.complaint_id=c.id 
    AND cr.mem_id!=c.member_id 
    GROUP BY cr.complaint_id)crl ON CONCAT(crep.posted_date,'_',crep.posted_time)=crl.last_posted_dt 
AND crep.complaint_id=crl.complaint_id 
Смежные вопросы