У меня есть две таблицы 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. Я не знаю, где я ошибся. Ответные жалобы, добавленные владельцем жалобы, не получены в этой таблице. Все идет нормально. Есть ли альтернативный способ получить результат?
вопрос стороны - почему вы делаете 'ALTER TABLE', чтобы сделать свой« ПЕРВЫЙ КЛЮЧ »/' Index' и 'AUTO_INCREMENT'? Почему бы просто не сделать это в объявлении таблицы? – Sean
http://dba.stackexchange.com/questions/101111/mysql-join-query-produces-wrong-result/101114#101114 –