[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: MySql: сумма с условием
exonix
Добрый день.
В php&MySql разбираюсь на уровне администратора. Т.е. могу только установить. Но вот нужно мне наваять простенькую страничку. Честно признаюсь: делаю я это поиском кода.
И так, что имею. Базу данных с 4 таблицами.
User, Quantity, Type, Time

Данные в виде:
User:
user.name1
user.name2

Quantity:
100
50

Type:
Free
Busy

что нужно:
чтобы была информация о том, какой пользователь, какого типа имеет сумму чисел.

Т.е.
user.name1 Free 29 Busy 48
user.name2 Free 11 Busy 34

время пока не нужно.

Что имею:

$query = 'SELECT * FROM `Log`';
$result = mysql_query($query) or die(mysql_error() ."<br/>". $query);

// строим таблицу
$table = "<table border=0 width=100% align=center>\n";
while ($row = mysql_fetch_assoc($result))
{
$table .= "<tr>\n";

$table .= "<td>".$row['User']."</td>\n";
$table .= "<td>".$row['Quantity']."</td>\n";
$table .= "<td>".$row['Type']."</td>\n";
$table .= "<td>".$row['Time']."</td>\n";
$table .= "</tr>\n";
}
$table .= "</table>\n";
echo $table;


Как найти сумму по полям я нашёл:


{
$result = mysql_query ("SELECT SUM(Pages) FROM Log",$db);
$row = mysql_fetch_row($result);
echo $row[0];
}

А вот как сумма с условием, что пользователь такой-то, и тип такой-то?
Я даже не знаю, как это у гугла спросить..........
Спасибо!




Спустя 21 минута, 36 секунд (16.07.2012 - 13:21) sergeiss написал(а):
Если я правильно понял, ты хочешь сам разобраться, как это сделать? Тогда подсказываю:
1. Скачай хэлп по Мускулю. В виде CHM мне лично больше всего нравится. Можно и в он-лайне смотреть.
2. Найди в хэлпе описание для SELECT, а там уже читай про WHERE.

Изучишь, если что не поймешь - спрашивай! smile.gif Подскажем smile.gif

Спустя 9 минут, 7 секунд (16.07.2012 - 13:30) exonix написал(а):
Цитата (sergeiss @ 16.07.2012 - 10:21)
Если я правильно понял, ты хочешь сам разобраться, как это сделать? Тогда подсказываю:
1. Скачай хэлп по Мускулю. В виде CHM мне лично больше всего нравится. Можно и в он-лайне смотреть.
2. Найди в хэлпе описание для SELECT, а там уже читай про WHERE.

Изучишь, если что не поймешь - спрашивай! smile.gif Подскажем smile.gif

Спасибо. Да, хотелось бы самому.
Т.е. получается, это вопрос скорее не по php а по mysql?

Спустя 4 минуты, 52 секунды (16.07.2012 - 13:35) sergeiss написал(а):
Цитата (exonix @ 16.07.2012 - 14:30)
Т.е. получается, это вопрос скорее не по php а по mysql?

Да, ты верно понял smile.gif И вообще. При работе с БД надо стараться сделать такой запрос, чтобы потом в ПХП только принять данные и вывести их, никак более не обрабатывать. В большинстве случаев такой подход позволяет более быстро и более качественно вести обработку.
При этом, естественно, могут стать значимыми вопросы оптимизации БД. Но зато в целом работа будет более правильная.

PS. Переношу тему в раздел "PHP + SQL".

Спустя 2 часа, 48 минут, 14 секунд (16.07.2012 - 16:24) exonix написал(а):
есть продвижение:
SELECT User,Type,SUM(Quantity) FROM Log GROUP BY User,Type;

В мускл получаю красивую табличку:

mysql> SELECT User,Type,SUM(Quantity) FROM Log GROUP BY User,Type;
+
---------------------+---------------------+---------------+
| User | Type | SUM(Quantity) |
+---------------------+---------------------+---------------+
| user.name1 | TYPE_1 | 32 |
| user.name1 | TYPE_2 | 1 |
| user.name2 | TYPE_1 | 19 |
| user.name3 | TYPE_1 | 1 |
| user.name3 | TYPE_2 | 13 |
| user.name4 | TYPE_1 | 17 |
| user.name4 | TYPE_2 | 19 |
| user.name5 | TYPE_1 | 164 |
| user.name5 | TYPE_2 | 23 |
| user.name6 | TYPE_2 | 6 |
| user.name7 | TYPE_1 | 77 |
| user.name7 | TYPE_2 | 6 |
| user.name8 | TYPE_1 | 9 |
+---------------------+---------------------+---------------+
13 rows in set (0.00 sec)


Эту команду нужно вставить в php. Есть аналог:
$result = mysql_query ("SELECT SUM(Quantity) FROM Log",$db);
$row = mysql_fetch_row($result);
echo $row[0];

пробую схитрить, просто заменить "SELECT SUM(Quantity) FROM Log" но не работает ))) Точнее, я в браузере вижу только имя первого в списке пользователя...
в какую сторону смотреть?

Спустя 50 минут, 42 секунды (16.07.2012 - 17:14) exonix написал(а):
УРА !!! Додумался !!!
<?php
$hostname = '192.168.10.17';
$username = 'root';
$password = 'asdasd';
$db = mysql_connect($hostname, $username, $password)
or die('connect to database failed');
mysql_set_charset('utf8');
mysql_select_db('DB')
or die('db not found');

$query = 'SELECT User,Type,SUM(Quantity) FROM `Log` GROUP BY User,Type';
$result = mysql_query($query) or die(mysql_error() ."<br/>". $query);

$table = "<table border=0 width=50% align=center>\n";
while ($row = mysql_fetch_assoc($result))
{
$table .= "<tr>\n";
$table .= "<td>".$row['User']."</td>\n";
$table .= "<td>".$row['Type']."</td>\n";
$table .= "<td>".$row['SUM(Quantity)']."</td>\n";
$table .= "</tr>\n";
}
$table .= "</table>\n";
echo $table;
mysql_close($db);
?>

выглядит так:
user posted image
Сейчас буду играться с полем Time...............

Спустя 23 часа, 51 минута, 18 секунд (17.07.2012 - 17:06) exonix написал(а):
а вот такой вопрос:
у меня поле Time "07/16/2012 11:17:36"
а как мне сделать, чтобы обрабатывалось только значение даты "07/16/2012", а время "11:17:36" игнорировалось?
Потому что когда я пишу:
$query = 'SELECT User,Type,SUM(Quantity),Time FROM `Log` WHERE Time="07/16/2012" GROUP BY User,Type';

мне ничего не возвращается...
И если поставить Time="07/16/2012 *" тоже... или там нужно использовать другой знак, который указывает на любые знаки после...
Мне именно в базе нужно, чтобы было со временем, а при обработке php - только дата.

Спустя 1 час, 33 минуты, 5 секунд (17.07.2012 - 18:39) sergeiss написал(а):
Используй функцию DATE() для извлечения только даты, без времени. И еще - лучше не используй для имен колонок слова типа TIME и другие, которые могут совпасть с именами функций или зарезервированных слов.
А если уж используешь такие имена, то тогда заключай их в "обратные кавычки": `time` - этот символ в английской раскладке находится на той же клавише, где и русская буква Ё.

Спустя 17 часов, 55 минут, 35 секунд (18.07.2012 - 12:34) exonix написал(а):
сам не осилил. мне помогли коллеги (решился у них спросить):
$query = 'SELECT User,Type,SUM(Quantity) FROM `Log` WHERE Time LIKE "07/16/2012%" GROUP BY User,Type';


Единственное, если выводить поле Time - то выводится со временем.

На будущее учту, о названии полей.

Спустя 28 минут, 50 секунд (18.07.2012 - 13:03) sergeiss написал(а):
WHERE DATE( `time` ) = '07/16/2012'

Единственное примечание - если таблица большая, то надо озабоиться созданием правильного индекса. Чтобы индесировать именно то, что написано, а не просто по полю time.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.