Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Mysql JOIN (LEFT или RIGHT) немогу допереть со стандарт хелпов!

7.3K
03 ноября 2010 года
shureg
67 / / 29.05.2010
Добрый день прочитал кучу Факов по данной Возможности, но всеравно не понимаю как заставить работать :p

По порядку....

1. Есть таблица `Names` - с нее нужно вытащить сумму всех имен `Alex`
2. Есть таблица `Famils` - с нее нужно вытащить сумму всех Фамилий `Ivanov`

Тоесть если использовать UNION то выборку делает как нужно... пример:

 
Код:
SELECT count(`id`) AS `imen` FROM `names` WHERE `item` = 'alex'
UNION SELECT count(`id`) FROM `famils` WHERE `item` = 'ivanov'


Данный запрос работает, но выдает результат Ячейка под ячейкой, а мне нужно чтобы выдало в строку, так что понял для этой цели нужно использовать LEFT или RIGHT JOIN!

но как писал выше - Допереть как его правильно составить я немогу!
Если есть варинат без JOINT'ов, то пишите и без них! буду благодарен.
385
03 ноября 2010 года
SomewherSomehow
477 / / 25.07.2004
У вас задача по двум независимым таблицам создать такую статистику? если да то используйте свои запросы как подзапросы.
 
Код:
select * from
( SELECT count(`id`) AS `imen` FROM `names` WHERE `item` = 'alex' ) a
cross join ( SELECT count(`id`) FROM `famils` WHERE `item` = 'ivanov' ) b

п.с. синатксис не проверял ибо негде.

А если у вас таблицы как-то относятся друг к другу, и надо например выбрать количество людей у которых сочетание имени и фамилии "алекс иванов", то тут как раз нужно сджоийнить по ключу, по которому они связаны и соотв. прописать ограничение в условии.
7.3K
03 ноября 2010 года
shureg
67 / / 29.05.2010
Цитата: SomewherSomehow

 
Код:
select * from
( SELECT count(`id`) AS `imen` FROM `names` WHERE `item` = 'alex' ) a
cross join ( SELECT count(`id`) FROM `famils` WHERE `item` = 'ivanov' ) b



Спасибо, работает.
Только вопрос - насколько cross join нагружает бд ???
что будет эффективнее:

 
Код:
$num_names = mysql_result(mysql_query("SELECT count(`id`) AS `names` FROM `names` WHERE `item` = 'alex' "),"`names`");
$num_famils = mysql_result(mysql_query("SELECT count(`id`) AS `famils` FROM `fa,ils` WHERE `item` = 'ivanov' "), "`famils`");


или ваш запрос?

 
Код:
$row = mysql_fetch_row(mysql_query("select * from
( SELECT count(`id`) AS `imen` FROM `names` WHERE `item` = 'alex' ) a
cross join ( SELECT count(`id`) FROM `famils` WHERE `item` = 'ivanov' ) b"
));
$num_names = $row[0];
$num_famils = $row[1];
385
03 ноября 2010 года
SomewherSomehow
477 / / 25.07.2004
Я всегда придерживаюсь той точки зрения, что лучший способ узнать "а как это по производительности" - это замерить ту самую производительность, в конкретной среде, на конкретных данных. В мускуле есть такие вещи как статистика запроса по времени, вводу выводу, планы выполнения? Если есть, то надо их и сравнить!

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

Если смущает именно кросс джоин используйте иннер джоин или любой другой (просто, не знаю как в мускуле, а согласно стандарту для инер джойна нужно поле по которому объединять, можете искусственно добавить его в результаты подзапроса). Но думаю оптимизатору будет что в лоб что по лбу и планы будут одинаковые. В мс-скуэль было бы так. Для мускуля - проверьте!

Короче, по-моему это уже дело вкуса.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог