Синтаксис объединений таблиц
Простое соединение - INNER JOIN:
SELECT <fields> FROM table1 INNER JOIN table2 ON table1.field1=table2.field2
или
SELECT <fields> FROM table1, table2 WHERE table1.field1=table2.field2
или
SELECT <fields> FROM table1 INNER JOIN table2 USING (field1)
если таблицы объединяются по полю field1.
В таком соединении выбираются только те строки таблиц, которые соответствуют условию объединения - равенство значений полей. Если для строки table1 нет соответствующей строки из table2, строка не попадает в итог запроса. Если же надо подсчитать количество сайтов в рубрике (продолжаю пример с каталогом), такой запрос не совсем подходит - в списке появятся только рубрики, в которых есть сайты. Для подобной операции нужно использовать LEFT JOIN.
SELECT <fields> FROM table1 LEFT JOIN table2 ON table1.field1=table2.field2
или
SELECT <fields> FROM table1 LEFT JOIN table2 USING (field1)
если таблицы объединяются по полю field1.
При этом соответствующей строки в table2 может и не быть, тогда в полях из table2 мы получим NULL, а если это групповая операция, как в случае с количеством сайтов в рубрике, тогда в поле будет 0:
SELECT rubs.id, name, COUNT(sites.id) AS sites FROM rubs LEFT JOIN sites ON rubs.id=sites.rub GROUP BY rubs.id
Заметьте: поля id есть в обеих таблицах, поэтому в их обозначении надо использовать имя таблицы. Кстати, если при объединении не используются групповые операции, всё равно лучше менять имя поля оператором AS, чтобы не возникало путаницы.
AleX, 06-12-2000 10:31
Да, и еще, объясните тогда дураку принципиальное назначение ключей, индексов? Ведь при связи селектром они не сильно то используются...
Darth, 06-12-2000 10:44
индексы для быстрого поиска
первичные ключи дла однозначной идентефикации строки в таблице
внешние ключи для связи таблиц
ну конечно MySQL не все поддерживает :(
Немного позже я собираюсь вернуться к этой теме и продолжить публичную разработку новостной ленты.