2013-05-21 3 views
0

Пожалуйста, мне нужно выяснить, что я делаю неправильно. Я создал этот внутренний код соединения для mysql. он работает, но он дает мне повторяющиеся значения, такие как повторение определенной строки дважды или категории в два раза. каждая из таблиц (users, paymentnotification, Monthlyreturns) имеет категорию, которая используется для проверки и отображения имени пользователя (users.pname) из таблицы пользователя, а затем проверяет и отображает те, которые произвели платеж из ежемесячной таблицы возвратов и платежей, используя категорию ,MYSQL Внутреннее соединение для трех-четырех таблиц

$r="SELECT monthlyreturns.categoryid, monthlyreturns.month, monthlyreturns.quarter, monthlyreturns.year,paymentnotification.amount, users.pname, monthlyreturns.ototal, paymentnotification.payee, status 
FROM paymentnotification 
INNER JOIN (monthlyreturns INNER JOIN users ON monthlyreturns.categoryid=users.categoryid) 
ON monthlyreturns.categoryid=paymentnotification.categoryid 
ORDER BY monthlyreturns.categoryid DESC"; 
+1

Не могли бы вы привести пример ваших таблиц на sqlfiddle http://sqlfiddle.com/? – BeNdErR

+0

Является ли категориями уникальными в каждой таблице? Если нет, и любая из таблиц содержит несколько строк с одинаковым значением категории, то вывод будет содержать несколько записей. Затем вам необходимо отфильтровать их либо с помощью «DISTINCT», либо с помощью ответа Pankaj Gadge, либо с помощью групповых функций в зависимости от полей, которые вам нужно, чтобы уменьшить их до одной строки на столбец. – Michael

+0

попробовал группу, но это только фильтрует его два рядов –

ответ

1

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

SELECT DISTINCT monthlyreturns.categoryid, monthlyreturns.month, monthlyreturns.quarter, monthlyreturns.year,paym entnotification.amount, users.pname, monthlyreturns.ototal, paymentnotification.payee, status 
FROM paymentnotification 
INNER JOIN monthlyreturns 
ON paymentnotification.categoryid = monthlyreturns.categoryid 
INNER JOIN users 
ON monthlyreturns.categoryid = users.categoryid 
ORDER BY monthlyreturns.categoryid DESC 
+0

мои таблицы соединены правильно, потому что я попробовал ваш, и он дал мне тот же результат. –

+1

@CharlesOkaformbah Ну, тогда это, вероятно, потому, что вы присоединяетесь к тому, что не уникально. Попробуйте добавить предложение DISTINCT. –

+0

не могли бы вы уточнить. –

1

Я думаю, что запрос вы хотите больше, как это:

SELECT b.categoryid, b.month, b.quarter, b.year, a.amount, c.pname, b.ototal, a.payee, status 
FROM paymentnotification a 
INNER JOIN monthlyreturns b 
    ON a.categoryid = b.categoryid 
INNER JOIN users c 
    ON b.categoryid = c.categoryid 
ORDER BY b.categoryid DESC 

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

+0

ничего не изменилось –

0

Я не вижу никаких проблем .. я получаю 4 строки результата: проверить эту скрипку http://sqlfiddle.com/#!2/165a22/5

это запрос я использовал:

SELECT m.categoryid, m.month, m.quarter, m.year,p.amount, u.pname, m.ototal, p.payee, m.status 
FROM paymentnotification p JOIN monthlyreturns m ON p.categoryid = m.categoryid 
JOIN users u ON u.categoryid = m.categoryid 
ORDER BY m.categoryid DESC 

нет дублированных строк, только «уникальных «строк, если вы рассматриваете каждый выбранный вами столб.

Надеется, что это помогает

+0

, спасибо за вашу помощь. Таблица оплаты не имеет «a0303» дважды в строке, а не в четыре раза. таблица dailyreturns используется для получения суммы «ototal column», в то время как таблица пользователей предназначена для получения имени (pname). Предвосхищая ваш ответ и извините за замешательство в моей презентации, используя sqlfiddle. Я новичок и только что узнал, как использовать его вчера, когда вы упомянули об этом. –

+0

, что поведение (четыре строки a0303) является нормальным, поскольку JOIN между вашими таблицами находит несколько значений, связанных с одним и тем же идентификатором в пути соединения. Если вы хотите получить ТОЛЬКО ОДНУЮ строку с id = a0303, я думаю, вам нужно вставить предложение GROUP BY (например, это http://sqlfiddle.com/#!2/165a22/14), но вы, вероятно, потеряете некоторые необходимую информацию. – BeNdErR

+0

жаль беспокоить вас по этому поводу. Я попробовал группу раньше, и результат, который у вас есть в sqlfiddle, - это то, что он дал мне, что не дает мне того, что я хочу. Он выбивает другие важные строки, такие как строка с одним и тем же идентификатором, но с разными данными. Есть ли способ заставить его показать нужные строки. –

0

ВЫБРАТЬ M.categoryid, M.month, M.quarter, M.year, M.ototal,

P.amount, P.payee, P.status, 

    U.pname 

ОТ paymentnotification AS P

INNER JOIN monthlyreturns AS M ON P.categoryid = M.categoryid

INNER JOIN пользователи AS U ON M.categoryid = U.categoryid

ORDER BY M.categoryid DESC

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