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']?
$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']?
вот у тебя и берет последнее значение в переменную.
честно говоря не помню как именно в масив засунуть, а просто добавить через знак препинания, пример:
$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 по переменным (если они есть-которые создаются при первой выборке на количество выбранных значений-строк).
могу нарисовать
или работа с массивами.-но сказать не могу, запяматовал, я использовал способ предыдущего абзаца)
предупреждаю-извращения с $i. - непомню точный синтаксис вокруг неё, и вообще, как тоя пожизненно обходил без отнимания, а тут вот оно как)
$nick = mysql_escape_string($_SESSION['userdata']['nick']);
$result2 = mysql_query("SELECT * FROM subjects WHERE nick = '$nick'");
$i='0';
if(mysql_num_rows($result2) > 0 && !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);
?>
Копайте в сторону использованя 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 Старайтесь избегать запросов внутри циклов неопределенного количества итераций - это может привести к чрезмерной нагрузке на сервер.
Как не читаю, читаю. Но дело в том, что они все написаны для профи, людей с опытом, которые уже представляют что к чему, и уж тем более для них не представляется трудной терминология программирования. Но вот пошаговых туториолов для 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'];
попробуй так
$row2 = mysql_fetch_assoc($result2);
$subjcase[$i] = $row2['subj'];
Попробую более менее наглядно объяснить.
Сначала мы берем таблицу 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)
сугой ^_^
Спасибо, это действительно гораздо понятнее, за схему отельное спасибо
В итоге, если сохранять это в переменную, все будет выглядеть
$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
Можно разделить запрос на несколько и проверить выполнение каждого?
будте внимательнее)
а простейший способ разделения как раз-перенос на другие строчки:
$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"));
А это здесь я так написал, в самом файле опечаток нет
$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"));
Та же ошибка
В данном случае, проблема тут - COUNT(works.*) Считать строки надо не по всем колонкам, а по одной. Например id или subject, то есть COUNT(works.id) или COUNT(works.subject).
Unknown table 'subjects'
Но такая таблица точно есть.
проверь, там ли запрос эту таблицу ищет.
В той ли базе данных? Или правильно ли порядок запроса построен? База точно та.