Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Считывание с трех табличек и подсчет записей
 
 автор: Shorr Kan   (02.06.2006 в 11:26)   письмо автору
 
 

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 - две-три...

   
 
 автор: cheops   (02.06.2006 в 11:31)   письмо автору
 
   для: Shorr Kan   (02.06.2006 в 11:26)
 

А какую ошибку возвращает?

   
 
 автор: Shorr Kan   (02.06.2006 в 11:32)   письмо автору
 
   для: cheops   (02.06.2006 в 11:31)
 

Ошибку не возвращает... просто возвращает неверную цифру - во всех табличках, все count сделал одинаковыми. Но я же знаю, что в tbl1 - не столько записей, сколько в tbl2 ...

   
 
 автор: Trianon   (02.06.2006 в 11:47)   письмо автору
 
   для: Shorr Kan   (02.06.2006 в 11:32)
 

По-моему, соединение (join) таблиц тут не подходит. Нужно делать объединение (union).

   
 
 автор: Shorr Kan   (02.06.2006 в 11:52)   письмо автору
 
   для: Trianon   (02.06.2006 в 11:47)
 

Поверьте, сейчас хотел попытаться-таки сам его составить... но просто уставился в поле для ввода sql-запроса, и не получается придумать. mysql.ru тоже решительно не захотел понятным стать...

   
 
 автор: Trianon   (02.06.2006 в 11:56)   письмо автору
 
   для: Shorr Kan   (02.06.2006 в 11:52)
 

Так а Вы сперва составьте три отдельных разных запроса.

Кстати, зачем их нужно объединять в один, если каждый из них должен возвратить по одному числу?

   
 
 автор: Shorr Kan   (02.06.2006 в 12:26)   письмо автору
 
   для: 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
?>


Но я так подумал, что это менее верно и дольше, нежели единым запросом. Нет?

   
 
 автор: Trianon   (02.06.2006 в 12:30)   письмо автору
 
   для: 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'

   
 
 автор: Shorr Kan   (02.06.2006 в 12:44)   письмо автору
 
   для: Trianon   (02.06.2006 в 12:30)
 

1) Получается, UNION надо ставить просто между разными селектами, и всё?
2) Замерил и этот вариант... и тот... скорость неизменна - 0 секунд...

   
 
 автор: Trianon   (02.06.2006 в 12:53)   письмо автору
 
   для: Shorr Kan   (02.06.2006 в 12:44)
 

1. Не всё. Порядок строк никто не гарантировал. Нужно сделать так, чтобы из строк, которые такой запрос может вернуть в пестром беспорядке, Вы смогли бы извлечь полезные данные.
для этого добавлены 1..3 as n первым полем.
2. А я о чем? Оно надо - загонять данные в один запрос?
То есть надо. конечно, если у Вас с хостером борьба за них поштучно идет. Но это, всё ж, экзотика.

   
 
 автор: tAleks   (23.08.2006 в 19:49)   письмо автору
 
   для: Trianon   (02.06.2006 в 12:30)
 

Это значит результат выдается в столбик. А как тоже самое, но получить в строку?
Чтобы потом mysql_fetch_assoc и получить массив.

   
 
 автор: Trianon   (23.08.2006 в 20:03)   письмо автору
 
   для: 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

   
 
 автор: tAleks   (23.08.2006 в 20:17)   письмо автору
 
   для: Trianon   (23.08.2006 в 20:03)
 

Что-то я не очень въезжаю, в этот запрос. Это что, вложеные запросы? Я с SQL занком 3 месяца. Поясните пожалуйста, для общего развития...

   
 
 автор: Trianon   (23.08.2006 в 20:53)   письмо автору
 
   для: tAleks   (23.08.2006 в 20:17)
 

да. Вложенные запросы. SELECT на месте ссылок на таблицы.
Смысл ясен если прочесть его как
SELECT c1,c2,c3 FROM t1,t2,t3

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования