PHP в деталях

       

Синтаксис объединений таблиц


Простое соединение - 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 не все поддерживает :(

Немного позже я собираюсь вернуться к этой теме и продолжить публичную разработку новостной ленты.



Содержание раздела