2014-09-05 3 views
2
SELECT 
       cat.CategoryID as CategoryID, 
       count(p.ProductID) as CountProducts 
      FROM 
       Category as cat 
       LEFT JOIN Products as p on p.CategoryID IN 
         (SELECT CategoryID FROM Category as cd 
          WHERE cd.ParrentCategoryID = '876') 
      WHERE 
       CategoryID = '876' 
      ORDER by Name 

Мы получаем ошибку - «Column 'CategoryID', где предложение неоднозначно».mysql ... in where предложение неоднозначно

Скажите, пожалуйста, как это будет правильно?

+2

Категория ИД находится в обеих таблицах. Не рекомендуется указывать столбец идентификатора с именем таблицы - просто «id» является отраслевым стандартом, потому что он работает лучше всего. – Bohemian

+0

Использование предиката 'IN (subquery)' в предложении 'ON' очень странно. Обычно предикаты в разделе «ON» ссылаются на столбцы из таблиц в предложении FROM. (У меня трудности с пониманием того, что на самом деле является желаемым набором результатов.) – spencer7593

ответ

1

Ошибки вы получаете говорит вам, что столбец CategoryID в вашем предложении WHERE неоднозначен, что означает, что система имеет проблемы, чтобы определить соответствующий столбец, потому что есть несколько CategoryID столбцов.

Для того, чтобы решить эту проблему, используйте псевдоним, чтобы указать, какой столбец вы хотите использовать для WHERE пункта:

SELECT cat2.CategoryID AS CategoryID 
    ,cat2.Name AS CategoryName 
    ,COUNT(p.ProductID) AS CountProducts 
FROM Category AS cat 
INNER JOIN Category AS cat2 ON cat2.ParrentCategoryID = cat.CategoryID 
INNER JOIN Products AS p ON p.CategoryID = cat2.CategoryID 
WHERE cat.CategoryID = '876' 
GROUP BY cat2.CategoryID, cat2.Name 
ORDER BY cat2.Name 

Я также немного изменился запрос, чтобы получить тот же результат, но вместо того, чтобы использовать сочетание LEFT JOIN + IN предложение + дополнительный запрос, я использовал INNER JOIN статьи. С помощью этого запроса вам нужно только определить желаемый CategoryID один раз, и он автоматически получит все дочерние категории.

Я не уверен, что ваш запрос работает правильно, потому что вы используете функцию COUNT без группировки результатов по CategoryID ...

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

+1

+1. Это более обычный шаблон для запроса; предикаты в столбце ON ссылаются на столбцы таблиц в предложении FROM (vs 'IN (подзапрос)', как в запросе OP. – spencer7593

+0

oh, им извините за это - длинная ночь, и я не вижу небольшой ошибки (= извините +1 за помощь и новые знания – 2014-09-05 07:29:49

+1

@learner Счастливые, если вы что-то узнали от этого, небольшие ошибки являются частью жизни разработчика ;-) Не забудьте отметить один из ответов как «принятый», чтобы закрыть вопрос –

0

Ошибка «неоднозначной колонки» означает, что имеется ссылка на идентификатор столбца, а MySQL имеет два (или более) возможных столбца, соответствующих спецификации. В этом конкретном случае ссылка на столбец CategoryID в пункте WHERE. «Неоднозначно» относится ли это к столбцу CategoryID от cat или столбцу CategoryID от p.

«Фиксация» заключается в том, чтобы квалифицировать эту ссылку на столбец с псевдонимом таблицы либо cat.CategoryID, либо p.CategoryID.


Некоторые дополнительные примечания:

Это очень странно иметь IN (subquery) предикат в предложении ON. Если CategoryID не является уникальным в таблице Category, этот запрос, скорее всего, будет генерировать больше строк, чем ожидалось.

нормальный шаблон для запроса, как это было бы что-то похожее на:

SELECT cat.CategoryID  AS CategoryID 
    , COUNT(p.ProductID) AS CountProducts 
    FROM Category cat 
    LEFT 
    JOIN Products p 
    ON p.CategoryID = cat.CategoryID 
WHERE cat.ParrentCategoryID = '876' 
ORDER BY cat.Name 

Обычно, предикаты в ON ссылочных положение столбцов в двух (или более) таблиц в предложении FROM. (Это не является обязательным требованием SQL. Это просто обычная картина.)

Сказуемое в предложении запроса ON выше указывает, что значение CategoryID колонки от cat (категория) таблица матч значение в CategoryID столбец из таблицы p (продукт).

Кроме того, наилучшей практикой является присвоение всех столбцов, на которые делается ссылка в запросе с именем таблицы, или псевдоним таблицы, даже если имена столбцов не являются двусмысленными. Например, столбец Name в предложении ORDER BY.

Одно большое преимущество в том, что если (в каком-то момент в будущем) столбец с именем Name добавляется в Products таблицу, запрос с неквалифицированной ссылкой на Name бы (тогда) начинает бросать «неоднозначную колонку "для этой ссылки. Таким образом, определение всех имен столбцов позволяет избежать «разрыва» рабочего запроса при добавлении новых столбцов в существующие таблицы.

Другим большим преимуществом является то, что читателю заявления. MySQL может очень быстро искать в словаре, чтобы найти, какая таблица Name. Но читатели инструкции SQL (например, я), которые не «знают», какая таблица содержит столбец с именем Name, также должны были бы посмотреть на определения таблиц выяснить. Если имя было квалифицированным, мы уже «знали», из какой таблицы был столбец.

+0

извините за плохой вопрос - длинная ночь ... +1 за помощь – 2014-09-05 07:30:55

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