|
|
|
| tbl1
id | user_id | word1 | hour | date
tbl2
id | user_id | word2 | hour | date
tbl3
id | user_id | word3 | hour | date
В каждой таблице - своё количество записей. Мне нужно выбрать за конкретную дату, конкретного пользователя - по часам данные, но не просто выборка, а количество записей... count... и одним запросом. То есть, что-то вроде:
SELECT
t1.hour AS hour,
COUNT(t1.id) AS word1,
COUNT(t2.id) AS word2,
COUNT(t3.id) AS word3
FROM tbl1 AS t1,tbl2 AS t2,tbl3 AS t3 WHERE
t1.user_id='$userid' AND t1.date='$date' AND
t2.user_id='$userid' AND t2.date='$date' AND
t3.user_id='$userid' AND t3.date='$date' AND
t1.hour=t2.hour AND t1.hour=t2.hour
GROUP BY t1.hour
|
Но сиё производство не работает...
При этом, в tbl1 может быть 20 записей, в tbl2 - 50 , а в tbl3 - две-три... | |
|
|
|
|
|
|
|
для: Shorr Kan
(02.06.2006 в 11:26)
| | А какую ошибку возвращает? | |
|
|
|
|
|
|
|
для: cheops
(02.06.2006 в 11:31)
| | Ошибку не возвращает... просто возвращает неверную цифру - во всех табличках, все count сделал одинаковыми. Но я же знаю, что в tbl1 - не столько записей, сколько в tbl2 ... | |
|
|
|
|
|
|
|
для: Shorr Kan
(02.06.2006 в 11:32)
| | По-моему, соединение (join) таблиц тут не подходит. Нужно делать объединение (union). | |
|
|
|
|
|
|
|
для: Trianon
(02.06.2006 в 11:47)
| | Поверьте, сейчас хотел попытаться-таки сам его составить... но просто уставился в поле для ввода sql-запроса, и не получается придумать. mysql.ru тоже решительно не захотел понятным стать... | |
|
|
|
|
|
|
|
для: Shorr Kan
(02.06.2006 в 11:52)
| | Так а Вы сперва составьте три отдельных разных запроса.
Кстати, зачем их нужно объединять в один, если каждый из них должен возвратить по одному числу? | |
|
|
|
|
|
|
|
для: Trianon
(02.06.2006 в 11:56)
| | Ну у меня завелась в самом начале мысль:
<?
for($i=0;$i<24;$i++){
$a1=mysql_fetch_array(mysql_query("SELECT COUNT(id) FROM tbl1 WHERE user_id='$userid' AND hour='$i' AND date='$date';"));
$a2=mysql_fetch_array(mysql_query("SELECT COUNT(id) FROM tbl2 WHERE user_id='$userid' AND hour='$i' AND date='$date';"));
$a3=mysql_fetch_array(mysql_query("SELECT COUNT(id) FROM tbl3 WHERE user_id='$userid' AND hour='$i' AND date='$date';"));
print $i." | ".$a1[0]." | ".$a2[0]." | ".$a3[0]."<br>";
}//for
?>
|
или... хехе....
<?
function rq($tbl,$userid,$date,$i){
return mysql_fetch_array(mysql_query("SELECT COUNT(id) FROM $tbl WHERE user_id='$userid' AND hour='$i' AND date='$date';"));
}//function
for($i=0;$i<24;$i++){
$a1=rq('tbl1',$userid,$date,$i)));
$a2=rq('tbl2',$userid,$date,$i)));
$a3=rq('tbl3',$userid,$date,$i)));
print $i." | ".$a1[0]." | ".$a2[0]." | ".$a3[0]."<br>";
}//for
?>
|
Но я так подумал, что это менее верно и дольше, нежели единым запросом. Нет? | |
|
|
|
|
|
|
|
для: Shorr Kan
(02.06.2006 в 12:26)
| | Ну если так беспокоит, то
SELECT 1 as n, COUNT(id) as c FROM tbl1 WHERE user_id='$userid' AND hour='$i' AND date='$date'
UNION SELECT 2 as n, COUNT(id) as c FROM tbl1 WHERE user_id='$userid' AND hour='$i' AND date='$date'
UNION SELECT 3 as n, COUNT(id) as c FROM tbl1 WHERE user_id='$userid' AND hour='$i' AND date='$date'
|
| |
|
|
|
|
|
|
|
для: Trianon
(02.06.2006 в 12:30)
| | 1) Получается, UNION надо ставить просто между разными селектами, и всё?
2) Замерил и этот вариант... и тот... скорость неизменна - 0 секунд... | |
|
|
|
|
|
|
|
для: Shorr Kan
(02.06.2006 в 12:44)
| | 1. Не всё. Порядок строк никто не гарантировал. Нужно сделать так, чтобы из строк, которые такой запрос может вернуть в пестром беспорядке, Вы смогли бы извлечь полезные данные.
для этого добавлены 1..3 as n первым полем.
2. А я о чем? Оно надо - загонять данные в один запрос?
То есть надо. конечно, если у Вас с хостером борьба за них поштучно идет. Но это, всё ж, экзотика. | |
|
|
|
|
|
|
|
для: Trianon
(02.06.2006 в 12:30)
| | Это значит результат выдается в столбик. А как тоже самое, но получить в строку?
Чтобы потом mysql_fetch_assoc и получить массив. | |
|
|
|
|
|
|
|
для: tAleks
(23.08.2006 в 19:49)
| | >Это значит результат выдается в столбик. А как тоже самое, но получить в строку?
>Чтобы потом mysql_fetch_assoc и получить массив.
Сегодня вечер извращений, да?
SELECT c1,c2,c3 FROM
(SELECT COUNT(id) as c1 FROM tbl1 WHERE user_id='$userid' AND hour='$i' AND date='$date')as t1,
(SELECT COUNT(id) as c2 FROM tbl2 WHERE user_id='$userid' AND hour='$i' AND date='$date')as t2,
(SELECT COUNT(id) as c3 FROM tbl3 WHERE user_id='$userid' AND hour='$i' AND date='$date')as t3
|
| |
|
|
|
|
|
|
|
для: Trianon
(23.08.2006 в 20:03)
| | Что-то я не очень въезжаю, в этот запрос. Это что, вложеные запросы? Я с SQL занком 3 месяца. Поясните пожалуйста, для общего развития... | |
|
|
|
|
|
|
|
для: tAleks
(23.08.2006 в 20:17)
| | да. Вложенные запросы. SELECT на месте ссылок на таблицы.
Смысл ясен если прочесть его как
SELECT c1,c2,c3 FROM t1,t2,t3 | |
|
|
|