SQL возвращает один и тот же результат несколько раз - PullRequest
1 голос
/ 14 июля 2011

Я новичок в продвинутых командах MySQL, у меня есть таблицы базы данных с несколькими связями. У меня есть функция расширенного поиска, которая должна сопоставлять ключевые слова с несколькими полями (большинство из которых находятся в таблице активов, но несколько в таблице пользователей). Когда я выполняю следующий запрос для стола, он возвращает одну и ту же строку несколько раз, в то время как он должен сделать это один раз.

 SELECT 
   a.id, a.asset_id, a.name, a.serial_number, a.category_id, a.status_id, a.user_id, a.location_id 
 FROM 
   assets a, users u 
 WHERE 
  (a.asset_ID LIKE '%desk%' OR a.name LIKE '%desk%' OR (u.first_name LIKE '%desk%' OR u.last_name LIKE '%desk%')) AND 
  a.serial_number LIKE '%%' AND 
  a.category_id='2' 
 LIMIT 25 OFFSET 5450 

Ответы [ 4 ]

10 голосов
/ 14 июля 2011

В вашем запросе декартово произведение .Вы должны присоединиться к ресурсам и пользователям, например, с

WHERE a.user_id = u.id

или подобным

FROM assets a JOIN users u ON a.user_id = u.id

ОБНОВЛЕНИЕ : Ваш комментарий показывает, что вы действительно хотите "оставить внешнее объединение""таблица пользователей.Это означает, что все активы находятся в наборе результатов независимо от того, существует ли соответствующий пользователь:

FROM assets a LEFT OUTER JOIN users u ON a.user_id = u.id

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

1 голос
/ 14 июля 2011

Вы должны фактически объединить две таблицы (активы и пользователи) вместе. Как вы понимаете, каждая строка в каждой таблице сопоставляется с каждой строкой в ​​другой. Это известно как декартово произведение, и обычно это плохо.

Я бы также предложил начать использовать правильный синтаксис JOIN:

SELECT
    a.id,
    a.asset_id,
    a.name,
    a.serial_number,
    a.category_id,
    a.status_id,
    a.user_id,
    a.location_id
FROM
    Assets A
INNER JOIN Users U ON A.user_id = U.user_id
WHERE
    (
        a.asset_ID LIKE '%desk%' OR
        a.name LIKE '%desk%' OR
        (
            u.first_name LIKE '%desk%' OR
            u.last_name LIKE '%desk%'
        )
    ) AND
    a.serial_number LIKE '%%' AND
    a.category_id='2'
LIMIT 25
OFFSET 5450
1 голос
/ 14 июля 2011

Вы можете использовать предложение SELECT DISTINCT, хотя реальная проблема выглядит как проблема, созданная Lukas.Рекомендуется использовать явные объединения, например, так:

 FROM assets a
 JOIN users u ON a.user_id=u.id
0 голосов
/ 14 июля 2011

Вам не хватает соединения между двумя таблицами.

Добавить что-то вроде

 AND  a.user_id = u.user_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...