select * from
( SELECT count(`id`) AS `imen` FROM `names` WHERE `item` = 'alex' ) a
cross join ( SELECT count(`id`) FROM `famils` WHERE `item` = 'ivanov' ) b
Mysql JOIN (LEFT или RIGHT) немогу допереть со стандарт хелпов!
По порядку....
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'
UNION SELECT count(`id`) FROM `famils` WHERE `item` = 'ivanov'
Данный запрос работает, но выдает результат Ячейка под ячейкой, а мне нужно чтобы выдало в строку, так что понял для этой цели нужно использовать LEFT или RIGHT JOIN!
но как писал выше - Допереть как его правильно составить я немогу!
Если есть варинат без JOINT'ов, то пишите и без них! буду благодарен.
Код:
п.с. синатксис не проверял ибо негде.
А если у вас таблицы как-то относятся друг к другу, и надо например выбрать количество людей у которых сочетание имени и фамилии "алекс иванов", то тут как раз нужно сджоийнить по ключу, по которому они связаны и соотв. прописать ограничение в условии.
Цитата: 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
( 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`");
$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];
( 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];
Вообще если выполнять кроссджоин для таблиц это затратная операция, т.к. идет декартово произведение, каждой строке ставится в соответсвие каждая строка, но в данном случае, у вас фактически по одной строке в подзапросе, думаю сервер рюхнет это и операция внешнего селекта получится не более затратной чем если бы выбор шел из двух предварительно посчитанных переменных.
Если смущает именно кросс джоин используйте иннер джоин или любой другой (просто, не знаю как в мускуле, а согласно стандарту для инер джойна нужно поле по которому объединять, можете искусственно добавить его в результаты подзапроса). Но думаю оптимизатору будет что в лоб что по лбу и планы будут одинаковые. В мс-скуэль было бы так. Для мускуля - проверьте!
Короче, по-моему это уже дело вкуса.