[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Тройная группировка или как то так)
web-monster
Привет! Вообщем есть такая таблица:

id FromUser FromUserPol ToUser ToUserPol StatusFrom StatusTo time
1 baltazar Мужской dimon Мужской + + 1252277537
2 nas6ko Женский cross47 Мужской + + 1253817136
2 dimon Мужской naysha Женский + + 1253816877
4 maniak Мужской baltazar Мужской + + 1252333308
5 maniak Мужской dimon Мужской + + 1252333322

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

Сейчас это делает 4 запроса, что я думаю не правильно, но в один мозга не хватает составить.

Вот они собственно 4 запроса:

$vsego_res = mysql_query("SELECT * FROM friends where ToUser='dimon'  AND StatusTo='+' AND StatusFrom='+' OR 
FromUser='dimon' AND StatusTo='+' AND StatusFrom='+' ORDER BY id DESC"
);
$kolvo_vsego=mysql_num_rows($vsego_res);

$devushek_res = mysql_query("SELECT * FROM friends where ToUser='dimon' AND StatusTo='+' AND StatusFrom='+' AND FromUserPol='Женский' OR
FromUser='dimon' AND StatusTo='+' AND StatusFrom='+' AND ToUserPol='Женский' ORDER BY id DESC"
);
$kolvo_devushek=mysql_num_rows($devushek_res);

$parni_res = mysql_query("SELECT * FROM friends where ToUser='dimon' AND StatusTo='+' AND StatusFrom='+' AND FromUserPol='Мужской' OR
FromUser='dimon' AND StatusTo='+' AND StatusFrom='+' AND ToUserPol='Мужской' ORDER BY id DESC"
);
$kolvo_parni=mysql_num_rows($parni_res);

$new_res = mysql_query("SELECT * FROM friends where ToUser='dimon' AND StatusTo='' ORDER BY id DESC");
$kolvo_new=mysql_num_rows($new_res);




Спустя 4 часа, 38 минут, 6 секунд (6.05.2010 - 12:20) KonstantinK написал(а):
Вообще не совсем понятно что в таблице но я думаю что запрос примерно такого вида
$res = mysql_query("SELECT * FROM friends where `FromUser`='dimon') 

Ну а потом уже все это отсортировать как душа пожелает, я думаю в одном цикле все и сосчитается

Спустя 50 минут, 1 секунда (6.05.2010 - 13:10) dr_Lev написал(а):
Цитата
Ну а потом уже все это отсортировать как душа пожелает, я думаю в одном цикле все и сосчитается

Зачем напрягать и без того напряженный PHP... данными должна заниматься база данный...
SELECT
SUM(t.cnt) AS cnt, MAX(t.pol) AS pol, MAX(t.`status`) AS `status`
FROM
(
SELECT
COUNT(*) AS cnt, MAX(fromuserpol) AS pol, MAX(STatusfrom) AS `status`
FROM
friends
WHERE
touser = 'dimon'
GROUP BY
fromuserpol, statusfrom
UNION ALL
SELECT

COUNT(*) AS cnt, MAX(touserpol) AS pol, MAX(statusto) AS `status`
FROM
friends
WHERE
fromuser = 'dimon'
GROUP BY
touserpol, statusto) t
GROUP BY
pol, `status`;

Запрос собирает в табличку количество друзей у пользователя, разбивая на количество по статусу и полу... табличка будет подобного вида:

cnt pol status
7 Мужской +
3 Мужской
4 Женский
3 Женский +

Спустя 6 минут, 48 секунд (6.05.2010 - 13:17) dr_Lev написал(а):
А вот выборка из это таблицы
$query = mysql_query($sql);
$kolvo_vsego = 0;
$kolvo_devushek = 0;
$kolvo_parni = 0;
$kolvo_new = 0
while ($row = mysql_fetch_assoc($query)){
$kolvo_vsego += $row['cnt'];
if ($row['pol'] == 'Женский'){
$kolvo_devushek += $row['cnt'];
}else{
$kolvo_parni += $row['cnt'];
}
if ($row['status'] != '+'){
$kolvo_new += $row['cnt'];
}
}


Спустя 56 минут, 7 секунд (6.05.2010 - 14:13) web-monster написал(а):
Спасибо! Всё работает!
Быстрый ответ:

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