|
|
|
| Не могу разобраться с этим вложенным запросом. Знаю точно, что он неправильный, но не могу найти причину. Нужно, чтобы в столбец Публикации выводился COUNT всех статей автора.
$sort = $_POST['sort'];
$query =
"SELECT (SELECT COUNT(title), authors.id_author FROM articles, authors WHERE authors.id_author=articles.author) as `tit`, DISTINCT authors.id_author, authors.last_name,authors.name,authors.patronymic,authors.publications,indexes.h_index
FROM authors,indexes
WHERE authors.id_author=indexes.author order by ".$sort." desc limit 20";
$result = mysql_query($query);
$i=0;
if (isset($_POST['sort'])) {
echo '<table>';
echo '<tr>';
echo '<th>№п/п</th>';
echo '<th>ФИО</th>';
echo '<th>Фамилия</th>';
echo '<th>Имя</th>';
echo '<th>Отчество</th>';
echo '<th>Публикации</th>';
echo '<th>Индекс Хирша</th>';
echo '</tr>';
while ($row = mysql_fetch_assoc($result)){
echo '<tr>';
$i++;
echo '<td align="center">'.$i.'.</td>';
echo '<td width="70px"><a href=info.php?id='.$row['id_author'].'> '.$row['id_author'].' </a></td>';
echo '<td width="120px">'.$row['last_name'].'</td>';
echo '<td width="100px">'.$row['name'].'</td>';
echo '<td width:100px>'.$row['patronymic'].'</td>';
echo '<td align="center">'.$row['tit'].'</td>';
echo '<td align="center">'.$row['h_index'].'</td>';
echo '</tr>';
}
echo '</table>';
}
|
| |
|
|
|
|
|
|
|
для: bool
(04.06.2014 в 12:10)
| | Он не только неправильный, но и странный к тому же. DISTINCT - получить только уникальные значения. То есть, получается, что id_author, которое просто обязано быть уникальным, у вас не уникально?
Я вам уже говорил, что подставлять внешние данные в запрос "как есть", это путь к взлому вашей базы, вы упорно продолжаете делать это.
Авторы - это первичная таблица, и каждая запись в ней, это уникальность. Статьи авторов, это вторичная таблица связанная с первичной по id авторов, поэтому:
<?
$query = 'SELECT *, (SELECT COUNT(*) FROM articles WHERE id_author=t1.id_author) tit FROM authors t1
ORDER BY '.mysql_real_escape_string($sort).' DESC LIMIT 20';
|
И логика структуры кода странная - сперва запрос к базе, а после него откуда не возьмись условие, если есть $_POST['sort'] (кстати почему не $sort, если уж используете эту переменную?) выдать таблицу. А почему проверка этого условия не до запроса к базе?
Вывод таблицы, это:
<?
$tbl = '<table><tr><th>№п/п</th><th>ФИО</th><th>Фамилия</th><th>Имя</th><th>Отчество</th><th>Публикации</th><th>Индекс Хирша</th></tr>';
while ($row = mysql_fetch_assoc($result)) {
$i++;
$tbl .= '<tr><td align="center">'.$i.'.</td><td width="70px"><a href=info.php?id='.$row['id_author'].'>'.$row['id_author'].
'</a></td><td width="120px">'.$row['last_name'].'</td><td width="100px">'.$row['name'].'</td><td width="100px">'.$row['patronymic'].
'</td><td align="center">'.$row['tit'].'</td><td align="center">'.$row['h_index'].'</td></tr>';
}
echo $tbl .= '</table>';
|
Пробелы в тексте ссылок, это просто два лишних ничего незначащих байта на каждую строку. И вывод строковых значений, это htmlspecialchars (если не только вы 100% доверяете данным в базе, а поэтому игнорируете). Странно и то, что параметр запроса id_author отображается и в качестве текста ссылки. | |
|
|
|
|
|
|
|
для: confirm
(06.06.2014 в 00:35)
| | огромное спасибо за критику и замечания! действительно, зациклилась на запросе и совершенно проигнорировала остальные моменты... | |
|
|
|