как правильно использовать JOIN? - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть две таблицы и таблица индексов foreign_key: таблица xymply_locations Я бы название Lat LNG

table xymply_categories
id
name

table xymply_categoryf_key
locid
catid

и я хочу выбрать категории, которые назначены locid 1. Как мне это сделать, я попробовал

SELECT * 
FROM `xymply_categoryf_key`, xymply_categories 
JOIN `xymply_categories` ON
        xymply_categories.id = xymply_categoryf_key.catid 
WHERE locid = 1; 

но я получаю "Not unique table/alias: 'xymply_categories' " и мне интересно, почему ...?

Ответы [ 3 ]

2 голосов
/ 16 февраля 2012

Вы смешиваете неявные (все таблицы, перечисленные в предложении FROM) и явные стили JOIN в своем коде, поэтому возникает ошибка.

SELECT xc.id, xc.name
    FROM xymply_categories xc
        INNER JOIN xymply_categoryf_key xck
            ON xc.id = xck.catid
    WHERE xck.locid = 1;
1 голос
/ 16 февраля 2012

В своем запросе вы выбираете из двух таблиц. Один из них - xymply_categoryf_key, другой - JOIN из двух экземпляров xymply_categories. Вы используете два экземпляра одной и той же таблицы, поэтому, когда вы пишете xymply_categories.id, не ясно, какой экземпляр вы имеете в виду - тот, который является первым аргументом JOIN, или тот, который является вторым аргументом? Вот что означает "Not unique table/alias". Если я правильно понимаю, что вы хотите сделать, попробуйте это:

SELECT c.id, c.name FROM xymply_categories c, xymply_categoryf_key k WHERE c.id = k.catid AND k.locid = 1;

Это было сделано без JOIN, хотя оценка

WHERE c.id = k.catid

может быть, будет быстрее с JOIN, я не уверен. Также обратите внимание на использование k и c в качестве псевдонимов для таблиц xymply_categoryf_key (k для ключа) и xymply_categories c (c для категорий). Вот как можно избежать проблемы «Неуникальная таблица / псевдоним», которая возникала у вас раньше. В вашем случае вы будете использовать, например,

xymply_categories a JOIN xymply_categories b WHERE a.id = ...

Итак, хотя я привел пример, как написать запрос без использования JOIN - как я уже говорил, использование JOIN может привести к более быстрому запросу. Поэтому все, что вам нужно сделать, это добавить псевдонимы.

0 голосов
/ 16 февраля 2012

Поскольку вы «присоединяетесь» к xymply_catagories дважды, поэтому БД хочет получить псевдоним для таблиц, чтобы узнать, к какому из них обращаться при выборе столбца.

Вы можете делать соединения несколькими способами в зависимости от того, что вы хотите. Прямое внутреннее соединение (которое кажется тем, что вы хотите) может быть

select * from xymply_categoryf_key a, xymply_categories b where a.catid = b.id 
WHERE b.locid = 1;

или вы также можете выполнить явное внутреннее соединение, как показывает Джо Стефанелли. Любой из них дает вам записи, где есть соответствующие данные из каждой таблицы.

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