2014-01-22 4 views
1

Мне сложно определить, почему мой запрос mysql возвращает ту же строку пять раз. Ниже приведен запрос. Я читаю здесь что-то о соединениях и продуктах с кардиотрансляцией. Я очень новичок в этом и редактирую этот запрос на своем сайте, который кто-то изначально создал. Пытаясь понять соединения, которые здесь используются, но это меня путает. Любая помощь приветствуется. Цель состоит в том, чтобы вернуть каждую строку только один раз, а не пять раз. Благодаря!mysql-запрос, возвращающий одну и ту же строку несколько раз

SELECT off . * , resp.tracking_date, resp.paid_date, resp.total_value, resp.total_conversion 
FROM tbl_offers AS off, tbl_tracking AS tr, tbl_trackvalue AS resp, tbloffers_cat AS offcat 
WHERE off.id = tr.offer_id 
AND off.offer_type = 'cash_offer' 
AND off.id = offcat.offer_id 
AND tr.id = resp.tracking_id 
AND tr.user_id = '1454' 
AND resp.total_value !=0 
AND resp.payment_status = 'paid' 
LIMIT 0 , 30 

Вау, спасибо за помощь всем. Похоже, что многие из упомянутых здесь решений будут работать. Я получил результат, который я хочу, добавив группу query_id в запрос. Не уверен, что это лучший способ сделать это или нет. Я просто участвую в программе, редактируя старый сайт, который изначально у меня был с кем-то другим. Много веселья. Все это - одна из самых сложных вещей, с которыми я сталкивался до сих пор, но я уверен, что это станет легче.

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

+1

Его работа правильна. Попробуйте использовать ключевое слово DISTINCT. – uhs

ответ

0

Это не выглядит как tbloffers_cat используется в запросе, и может содержать строки, которые не видны в вашем наборе результатов. Чтобы проверить это, добавьте tbloffers_cat.* к вашему запросу и посмотрите, отличаются ли значения в этих полях от строки к строке.

Если это так, попробуйте это:

SELECT off.* 
    , resp.tracking_date 
    , resp.paid_date 
    , resp.total_value 
    , resp.total_conversion 
FROM tbl_offers AS off 
    INNER JOIN tbl_tracking AS tr ON tr.offer_id = off.id 
    INNER JOIN tbl_trackvalue AS resp ON resp.tracking_id = tr.id 
WHERE off.offer_type = 'cash_offer' 
AND tr.user_id = '1454' 
AND resp.total_value !=0 
AND resp.payment_status = 'paid' 
LIMIT 0 , 30 

На мой взгляд, синтаксис внутренних соединений, как правило, понятнее при рассмотрении запроса.

+0

Хотя все были полезны, ваши получили мне результаты, которые мне нужны, без добавления моей группы по обходному пути. Все остальные ответы по-прежнему возвращают несколько строк. Все еще не совсем понимаю, почему это работает, но теперь я могу вникать в ваше решение, чтобы понять различия. Благодарю. – programmingnewb

+0

Похоже, что это связано с внутренним соединением и левым соединением. Внутреннее соединение дает мне только те результаты, которые мне нужны, в то время как левое соединение возвращало несколько строк для одних и тех же данных. – programmingnewb

+0

Не видя всей схемы таблиц, самое лучшее, что я могу вам сказать, это то, что в таблице tbloffers_cat должно быть несколько строк, которые соответствуют более чем одной записи, когда вы смотрите только на tbloffers_cat.offer_id. У меня есть подозрение, что эти таблицы действительно соответствуют различным критериям. –

0

У вас есть cartesian product в вашем запросе.

Вы должны присоединиться к tbl_offers и все другие таблицы, как этот

ИЗ tbl_offers объединение tbl_tracking Мириэль a.id = u.offer_id

Так что попробуйте, как этот

SELECT off. * , resp.tracking_date, resp.paid_date, resp.total_value, resp.total_conversion 
FROM tbl_offers AS off 
JOIN tbl_tracking AS tr 
ON off.id = tr.offer_id 
JOIN tbl_trackvalue AS resp 
ON tr.id = resp.tracking_id 
JOIN tbloffers_cat AS offcat 
ON off.id = offcat.offer_id 
WHERE off.offer_type = 'cash_offer' 
    AND tr.user_id = '1454' 
    AND resp.total_value !=0 
    AND resp.payment_status = 'paid' 
LIMIT 0 , 30 

Подробнее о соединяя таблицы здесь: http://dev.mysql.com/doc/refman/5.5/en/join.html

+0

Хотя я согласен с тем, что должны использоваться явные объединения, запрос OP определяет объединения в критериях where. –

+0

Я не уверен, что это лучшее решение, но теперь я получаю результат, который я хочу, добавив: group by tracking_id в запрос. Я все еще участвую в обновлении своего сайта, поэтому я уверен, что узнаю больше о том, почему это продолжалось. – programmingnewb

2

Хотя ваш запрос должен работать по назначению, он использует устаревший синтаксис, я предлагаю заменить th е осуждается неявным присоединяется стандарт явно присоединяется:

SELECT off. * , resp.tracking_date, resp.paid_date, resp.total_value, resp.total_conversion 
FROM tbl_offers AS off 
JOIN tbl_tracking AS tr 
ON off.id = tr.offer_id 
JOIN tbl_trackvalue AS resp 
ON tr.id = resp.tracking_id 
JOIN tbloffers_cat AS offcat 
ON off.id = offcat.offer_id 
WHERE off.offer_type = 'cash_offer' 
    AND tr.user_id = '1454' 
    AND resp.total_value !=0 
    AND resp.payment_status = 'paid' 
LIMIT 0 , 30 

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

+0

Когда вы используете этот синтаксис, какой тип соединения выполняется? – programmingnewb

+0

@ user2616350 'JOIN' =' INNER JOIN', 'LEFT JOIN' =' LEFT OUTER JOIN', 'RIGHT JOIN' =' RIGHT OUTER JOIN' –

+0

Спасибо, что ответили на это. – programmingnewb

0

SQL СТАЛ

Codeproject имеет этот образ, объясняющий простые основы SQL объединений, взяты из:

Visual Representation of SQL Joins

enter image description here

обновление запроса следующим образом здесь

SELECT off.*,resp.tracking_date, resp.paid_date, resp.total_value, resp.total_conversion 
FROM tbl_offers AS off 
LEFT JOIN tbl_tracking AS tr ON tr.offer_id = off.id 
LEFT JOIN tbl_trackvalue AS resp ON resp.tracking_id = tr.id 
LEFT JOIN tbloffers_cat AS offcat ON offcat.offer_id = off.id 
WHERE off.offer_type = 'cash_offer' 
AND tr.user_id = '1454' 
AND resp.total_value != 0 
AND resp.payment_status = 'paid' 
LIMIT 0 , 30 

надеюсь, что это будет решить вашу проблему

+0

+1 для графиков ... –

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