A kid from The Ural's
Такая небольшая трудность возникла с SELECT COUNT

$result2 = mysql_query("SELECT * FROM subjects WHERE nick = '" . mysql_escape_string($_SESSION['userdata']['nick']) . "'");
if(mysql_num_rows($result2) > 0 && !mysql_error()){
while($row2 = mysql_fetch_assoc($result2)){

$row2 = mysql_fetch_assoc($result2);
$subjcase = $row2['subj'];
}
}
$worknumb = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS cnt2 FROM works WHERE subject = '$subjcase'"));

Могут быть два допустимых значения у $row2['subj']?
Но при посчете возврещенных рядов берется только одно

$worknumb = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) AS cnt2 FROM works WHERE subject = '$subjcase'"));

Как видите, пытался заводить в цикл, но результат такой же - берется одно значение $row2['subj']?

Можно как нибудь делать выборку с COUNT учитывая все значения $row2['subj']?

@темы: MySQL, PHP

Комментарии
03.04.2008 в 23:09

Хаотичный нейтрал.
в цикл завёл, но забыл приплюсовывать\добавлять в массив.

вот у тебя и берет последнее значение в переменную.

честно говоря не помню как именно в масив засунуть, а просто добавить через знак препинания, пример:
$subjcase='';
if(mysql_num_rows($result2) > 0 && !mysql_error()){
while($row2 = mysql_fetch_assoc($result2)){

$row2 = mysql_fetch_assoc($result2);
$subjcase = $subjcase.','.$row2['subj'];
}}

++
но это было по сути вопроса, а по сути задачи-это не поможет.
во 2й выборке надо делать или выборку через AND по переменным (если они есть-которые создаются при первой выборке на количество выбранных значений-строк).
могу нарисовать

или работа с массивами.-но сказать не могу, запяматовал, я использовал способ предыдущего абзаца)
03.04.2008 в 23:26

Хаотичный нейтрал.
вот например, делалось на глаз, кстати-"массивный" вариант, само так получилось ))

предупреждаю-извращения с $i. - непомню точный синтаксис вокруг неё, и вообще, как тоя пожизненно обходил без отнимания, а тут вот оно как)

<?
$nick 
mysql_escape_string($_SESSION['userdata']['nick']);
$result2 mysql_query("SELECT * FROM subjects WHERE nick = '$nick'");

$i='0';
if(
mysql_num_rows($result2) > && !mysql_error()){
while(
$row2 mysql_fetch_assoc($result2)){
$subjcase[$i] = mysql_fetch_assoc($result2)['subj'];
$i++;
}}
///////////
while($i!='-1'){
$worknumb[$i] = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) 
AS cnt2 FROM works WHERE subject = '$subjcase[$i]'"
));
$i=$i-1;
}

print_r($worknumb);
?>

04.04.2008 в 00:18

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Kevin McLean Когда вы начнете читать мануалы? =)

Копайте в сторону использованя JOIN, и COUNT в сочетании с GROUP BY. Запрос должен получиться наподобии

SELECT s.*, COUNT(w.*) AS cnt2
FROM subjects AS s
LEFT JOIN works as w
ON s.subj = w.subject WHERE nick = '" . mysql_escape_string($_SESSION['userdata']['nick']) . "' GROUP BY s.id

ritor Старайтесь избегать запросов внутри циклов неопределенного количества итераций - это может привести к чрезмерной нагрузке на сервер.
04.04.2008 в 11:39

Хаотичный нейтрал.
...это плохо влияет на карму ;) ^_^
04.04.2008 в 21:40

A kid from The Ural's
FVA

Как не читаю, читаю. Но дело в том, что они все написаны для профи, людей с опытом, которые уже представляют что к чему, и уж тем более для них не представляется трудной терминология программирования. Но вот пошаговых туториолов для stupid очень мало.

Мануал, который я читал - www.mysql.ru/docs/man/LEFT_JOIN_optimisation.ht...
Пытаюсь провести паралель с шаблоном запроса, который вы предложили
SELECT subjects.subj, COUNT(works.*) AS cnt2
FROM subjects AS subj
LEFT JOIN works as subject
ON subjects.subj = works.subject WHERE nick = '" . mysql_escape_string($_SESSION['userdata']['nick']) . "' GROUP BY subject.id
1) SELECT subjects.subj, COUNT(works.*) AS cnt2 - выбираем все значения поля subj из таблицы subj, а также выбираем и считаем все поля в таблице works?
2) FROM subjects AS subj
LEFT JOIN works as subject
ON subjects.subj = works.subject - это слишком большая и запутанная часть. Понятно что устанавливается звисисмость works on subject, но что тут к чему очень сложно понять :(



ritor

Понятный код :), хоть и выдает пока ошибку
Parse error: syntax error, unexpected '['
в $subjcase[$i] = mysql_fetch_assoc($result2)['subj'];
04.04.2008 в 23:38

Хаотичный нейтрал.
я просто хотел убрать лишнюю переменную.
попробуй так

$row2 = mysql_fetch_assoc($result2);
$subjcase[$i] = $row2['subj'];
04.04.2008 в 23:43

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Не тот читаешь. www.mysql.ru/docs/man/JOIN.html

Попробую более менее наглядно объяснить.

Сначала мы берем таблицу subjects и выбираем из нее все строки, поле nick которых соответствует условию "WHERE nick...". Кроме этого, мы хотим получить в дополнительном столбце результатов количество работ этого пользователя по каждой из тем. Для этого нам нужно связать таблицу subjects и таблицу works между собой и выбрать для каждой строки из таблицы sublects количество соответствующих условиям строк из таблицы works. В данном случае мы связываем их по полям subj и subject . То есть, мы говорим - бери из таблицы works (LEFT JOIN works) только те строки, значение поля subject которых соответствует текущей строке (ON subjects.subj = works.subject). Кроме того, чтобы засунуть результат в один столбец к каждой выбранной строке из таблицы subjects, нам надо выбранные из works строки сгруппировать в одну (к одной строке много не приклеишь ведь). Для этого используется GROUP BY subjects.id. То есть мы группируем полученные результаты по теме, что дает гарантию что при группировке из subjects никакие строки не потеряются (поскольку они там все разные для одного пользователя), а все строки из works будут сгруппированы в одну, поскольку при наших условиях, темы в них как раз одинаковые.

Словами понятнее не могу. Для большей наглядности набросал графическую схемку (1831х1349)
05.04.2008 в 00:05

Хаотичный нейтрал.
FVA
сугой ^_^
05.04.2008 в 13:59

A kid from The Ural's
FVA
Спасибо, это действительно гораздо понятнее, за схему отельное спасибо
В итоге, если сохранять это в переменную, все будет выглядеть
$worknumb = mysql_fetch_assoc(mysql_query("SELECT subjects.*, COUNT(works.*) AS cnt2
FROM subjects AS subj
LEFT JOIN works as subject
ON subjects.subj = works.subject WHERE nick = '" . mysql_escape_string($_SESSION['userdata']['nick']) . "' GROUP BY subjectы.id"));
Хотя запрос не выполняется :( Не может осуществить выборку
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/g/sitename/public_html/workthings/counting.php on line 7
Можно разделить запрос на несколько и проверить выполнение каждого?


05.04.2008 в 14:29

Хаотичный нейтрал.
"subject[color=red]ы[/color].id"));"

будте внимательнее)

а простейший способ разделения как раз-перенос на другие строчки:

$worknumb = mysql_fetch_assoc(mysql_query("
SELECT subjects.*, COUNT(works.*) AS cnt2
FROM subjects AS subj
LEFT JOIN works as subject
ON subjects.subj = works.subject
WHERE nick = '" . mysql_escape_string($_SESSION['userdata']['nick']) . "'
GROUP BY subjects.id"));

05.04.2008 в 17:32

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
А еще вы неправильно используете именование таблиц "AS". =)
05.04.2008 в 22:02

A kid from The Ural's

А это здесь я так написал, в самом файле опечаток нет :)
$worknumb = mysql_fetch_assoc(mysql_query("SELECT subjects.*, COUNT(works.*) AS cnt2
FROM subjects AS subj
LEFT JOIN works AS subject
ON subjects.subj = works.subject WHERE nick = '" . mysql_escape_string($_SESSION['userdata']['nick']) . "' GROUP BY subjects.id"));

Та же ошибка
05.04.2008 в 23:46

Будем же учиться хорошо мыслить - вот основной принцип морали (с) Паскаль
Kevin McLean Я уже объяснял как анализировать подобные ситуации через mysq_error()...
В данном случае, проблема тут - COUNT(works.*) Считать строки надо не по всем колонкам, а по одной. Например id или subject, то есть COUNT(works.id) или COUNT(works.subject).
06.04.2008 в 23:09

A kid from The Ural's
FVA
Unknown table 'subjects'
Но такая таблица точно есть.
06.04.2008 в 23:34

Хаотичный нейтрал.
Kevin McLean
проверь, там ли запрос эту таблицу ищет.
08.04.2008 в 19:24

A kid from The Ural's
ritor

В той ли базе данных? Или правильно ли порядок запроса построен? База точно та.

Расширенная форма

Редактировать

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail