SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.04.2011 15:17:39

Doxtor
Завсегдатай
Зарегистрирован: 06.08.2009
Сообщений: 61

Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

Добрый день.

Есть две таблицы "Факторы" (fakt) и "Количество голосов за тот или иной фактор" (fakt_cnt)
fakt_cnt состоит из полей fakt_id и cnt. В cnt имеем единицы и нули. (надеюсь понятно обьяснил)
1. Выводим названия факторов.
2. Выводим количество голосов по каждому фактору и сортируем так, чтобы ничего не перемешалось. smile

Получаем что-то вроде:
Фактор_1  5 (голосов)
Фактор_2  3
Фактор_3  2
Фактор_4  1
Фактор_5  0

Цель: не выводить Фактор_5  0 как и все остальные нулевые значения

Что у меня получилось за 4 часа мучений:
1. Количество голосов выводит корректно (тут спасибо PHP)


$result_fakt_cnt = mysql_query("SELECT fakt_cnt.fakt_id, SUM(fakt_cnt.cnt) FROM fakt_cnt
LEFT JOIN fakt ON fakt_cnt.fakt_id = fakt.id
GROUP BY fakt_cnt.fakt_id
ORDER BY SUM(fakt_cnt.cnt) DESC"
, $db);
$fakt_cnt = mysql_fetch_array($result_fakt_cnt);

do{
if($fakt_cnt["SUM(fakt_cnt.cnt)"] == 0) continue;
printf("<div>%s</div>",$fakt_cnt["SUM(fakt_cnt.cnt)"]);
}
   while ($fakt_cnt = mysql_fetch_array($result_fakt_cnt));



А названия никак не хочет (Варианты я приводить не буду, мне кажется я уже всё перепробовал, но правильно сформировать запрос не получилось.)
Код, который выводит все значения:

$result_fakt = mysql_query("SELECT fakt.id, fakt.name FROM fakt
LEFT JOIN fakt_cnt ON fakt.id = fakt_cnt.fakt_id
GROUP BY fakt_cnt.fakt_id
ORDER BY SUM(fakt_cnt.cnt) DESC"
, $db);
$fakt = mysql_fetch_array($result_fakt);

do{
  printf("<div>%s</div>",$fakt["name"]);
}
while ($fakt = mysql_fetch_array($result_fakt));


P.S. Всё находиться в начальной стадии разработки, поэтому ешё возможны кординальные изменения. Если есть возможность как-то иначе организовать процесс, пожалуйста, посоветуйте.
Как обычно с благодарностью, Андрей

Отредактированно Doxtor (14.04.2011 15:30:15)

Неактивен

 

#2 14.04.2011 15:51:00

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

Кажется, у вас проблема в клиентском коде (т.е. PHP), а не в запросе (хотя вообще-то, если вы не хотите нулевых значений — просто добавьте в конец запроса HAVING(SUM(..) > 0), тогда сервер сам вас от них избавит).

Давайте я вам посоветую крошечную библиотечку, которая вам сильно облегчит жизнь. Вот: http://webew.ru/articles/3237.webew

С ней ваш код станет вот таким (я туда добавил использование пседвонимов колонок (это когда добавляется AS и что-то еще), чтобы имена столбцов покороче были):


$sql = "
    SELECT
        fakt_id AS id,
        fakt_name AS name,
        SUM(cnt) AS sum
    FROM fakt_cnt fc
    LEFT JOIN fakt f ON fc.fakt_id = f.id
    GROUP BY fc.fakt_id
    ORDER BY SUM(fc.cnt) DESC
    HAVGIN SUM(fc.cnt) > 0
    "
;
$data = mysql_gettable($sql);

foreach ($data as $row)
    echo "$row[id] $row[cnt]<br>";
   
// а потом так же для названий
 

Неактивен

 

#3 14.04.2011 17:08:18

Doxtor
Завсегдатай
Зарегистрирован: 06.08.2009
Сообщений: 61

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

Для того чтобы полностю понять:

<?php
$result_fakt = mysql_query("SELECT fakt.id, fakt.name FROM fakt
LEFT JOIN fakt_cnt ON fakt.id = fakt_cnt.fakt_id
GROUP BY fakt_cnt.fakt_id
ORDER BY SUM(fakt_cnt.cnt) DESC
HAVING SUM(fakt_cnt.cnt) > 0"
, $db);
$fakt = mysql_fetch_array($result_fakt);

do{
  printf("<div>%s</div>",$fakt[name]);
}
while ($fakt = mysql_fetch_array($result_fakt));
?>


Возвращает:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...

Неактивен

 

#4 14.04.2011 17:11:12

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

Скорее всего, какая-то ошибка в запросе (mysql_query никаких сообщений при этом не генерирует).

Попробуйте $result_fakt = mysql_query(...) OR die(mysql_error());

Неактивен

 

#5 14.04.2011 17:21:29

Doxtor
Завсегдатай
Зарегистрирован: 06.08.2009
Сообщений: 61

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'HAVING SUM(fakt_cnt.cnt) > 0' at line 5

sad


На всякий случай:
БД-Версия  5.1.54
MySQL-Client-Version: 5.1.39

Что делать?

Отредактированно Doxtor (14.04.2011 17:38:34)

Неактивен

 

#6 14.04.2011 17:59:29

Doxtor
Завсегдатай
Зарегистрирован: 06.08.2009
Сообщений: 61

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

Немного разобрался:
правильный синтаксис GROUP -> HAVING -> ORDER

$result_fakt = mysql_query("SELECT fakt.id, fakt.name FROM fakt
LEFT JOIN fakt_cnt ON fakt.id = fakt_cnt.fakt_id
GROUP BY fakt_cnt.fakt_id
HAVING SUM(fakt_cnt.cnt) > 0
ORDER BY SUM(fakt_cnt.cnt) DESC"
, $db) OR die(mysql_error());
$fakt = mysql_fetch_array($result_fakt);

do{
  printf("<div>%s</div>",$fakt[name]);
}
while ($fakt = mysql_fetch_array($result_fakt));


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

Неактивен

 

#7 16.04.2011 00:28:48

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

А почему Вы перестали выводить сумму, как раньше, а стали выводить
просто поле (по которому еще и не группируете)?

Неактивен

 

#8 16.04.2011 15:06:18

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

А сделайте как вы простой JOIN, а не LEFT (т.к. зачем вам записи из fakt, для которых нет записей в fakt_cnt? Так вам даже HAVING не понадобится)

Неактивен

 

#9 18.04.2011 15:24:02

Doxtor
Завсегдатай
Зарегистрирован: 06.08.2009
Сообщений: 61

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

paulus написал:

А почему Вы перестали выводить сумму, как раньше, а стали выводить
просто поле (по которому еще и не группируете)?

Добрый день.
Сумму я вывожу как и раньше, я просто те стал писать этот запрос, т.к. нашли решение, через HAVING :

$result_fakt_cnt = mysql_query("SELECT
fakt_cnt.fakt_id,
SUM(fakt_cnt.cnt)
FROM fakt_cnt
LEFT JOIN fakt ON fakt_cnt.fakt_id = fakt.id
GROUP BY fakt_cnt.fakt_id
HAVING SUM(fakt_cnt.cnt) > 0
ORDER BY SUM(fakt_cnt.cnt) DESC"
, $db);
$fakt_cnt = mysql_fetch_array($result_fakt_cnt);


А вот невыводить названия полей из таблицы "fakt", если сумма полей "cnt" из таблицы "fakt_cnt" равна нулю никак не осилю.
Я предполагаю, что как-то каряво изъясняюсь, но итог состоит из двух запросов и должен выглядеть примерно вот так:

Фактор_1  5 (голосов)
Фактор_2  4
Фактор_3  3
Фактор_4  2
Фактор_5  1

Или я как-то нетак объясняю или принципиально невозможно сформировать запрос?

Отредактированно Doxtor (18.04.2011 15:31:07)

Неактивен

 

#10 18.04.2011 15:27:36

Doxtor
Завсегдатай
Зарегистрирован: 06.08.2009
Сообщений: 61

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

LazY написал:

А сделайте как вы простой JOIN, а не LEFT (т.к. зачем вам записи из fakt, для которых нет записей в fakt_cnt? Так вам даже HAVING не понадобится)

Записи есть (итоговый запрос более обширный), я просто упростил запрос.

Неактивен

 

#11 19.04.2011 15:02:07

Doxtor
Завсегдатай
Зарегистрирован: 06.08.2009
Сообщений: 61

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

Я прошу прощения за настойчивость, и хочу повторить вопрос: неужели нельзя сделать запрос?

Неактивен

 

#12 19.04.2011 18:40:27

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

Попробуйте еще HAVING SUM(...) > 0 AND SUM(...) IS NOT NULL.

Неактивен

 

#13 20.04.2011 13:45:56

Doxtor
Завсегдатай
Зарегистрирован: 06.08.2009
Сообщений: 61

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

LazY написал:

Попробуйте еще HAVING SUM(...) > 0 AND SUM(...) IS NOT NULL.

Не до конца понял, но разобрался. Спасибо.

Запрос, который Вы предложили почему-то не работает:

SELECT fakt.id, fakt.name FROM fakt
LEFT JOIN fakt_cnt ON fakt.id = fakt_cnt.fakt_id
GROUP BY fakt_cnt.fakt_id
HAVING SUM(fakt_cnt.cnt) > 0
ORDER BY SUM(fakt_cnt.cnt) DESC


Но общий запрос выбирает всё верно:


SELECT
fakt.id,
fakt.name
FROM fakt
LEFT JOIN fakt_cnt ON fakt.id = fakt_cnt.fakt_id
LEFT JOIN vote ON fakt_cnt.vote_id = vote.id
WHERE vote.vote_date > CURRENT_DATE() - INTERVAL 1 YEAR
AND fakt.cat = 1
GROUP BY fakt_cnt.fakt_id
HAVING SUM(fakt_cnt.cnt) > 0
ORDER BY SUM(fakt_cnt.cnt) DESC
 

Отредактированно Doxtor (20.04.2011 15:55:55)

Неактивен

 

#14 21.04.2011 05:14:57

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

Запрос, который Вы предложили почему-то не работает:

А как конкретно он не работает? В чем ошибка?

Неактивен

 

#15 21.04.2011 18:00:08

Doxtor
Завсегдатай
Зарегистрирован: 06.08.2009
Сообщений: 61

Re: Не выводить строки из таб1 если SUM(столбец) из таб2 равен нулю

Выдаёт все записи.
Но мне не принципиально, главное, что  общий запрос работает верно.
Спасибо.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson