Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: COUNT и LEFT JOIN неправильный подсчет
 
 автор: tAleks   (29.07.2011 в 15:36)   письмо автору
 
 

Есть две таблицы:

Таблица со статьями:

CREATE TABLE articles(
  id_article INT(11) NOT NULL AUTO_INCREMENT,
  title TINYTEXT NOT NULL ,
  body TEXT NOT NULL,
  PRIMARY KEY (id_article)
)


Таблица с метками:

CREATE TABLE articles_tags(
  id_article INT(11) NOT NULL COMMENT 'Ключ на стаью',
  tag VARCHAR(255) NOT NULL COMMENT 'Метка в тарнслите',
  name VARCHAR(255) NOT NULL COMMENT 'Название метки (кирилица)',
  INDEX tag (tag (10))
)


Для постраничной навигации нужно посчитать кол-во записей в запросе, с фильтром по метке.

Делаю такой запрос:

SELECT COUNT(*) FROM articles
LEFT JOIN articles_tags ON articles_tags.id_article = articles.id_article
WHER articles_tags.tag = 'sport'



Если метка есть не более чем у одной статьи, то все норм, а если метка у двух и более статей, то данный запрос выдает не верное кол-во записей.

Как я понимаю, считает неправильно именно потому, что в правой табилце "articles_tags" есть несколько записей соответствующие одной записи в левой таблице "articles". В другом бы случае я бы просто добавил GROUP BY articles.id_article, но в данном случае, с COUNT(*) это дает совершенно другой результат.

Как посчитать кол-во записей в данном случае? Кто занет, подскажите плиз. Очень нужно.

  Ответить  
 
 автор: tAleks   (30.07.2011 в 08:51)   письмо автору
 
   для: tAleks   (29.07.2011 в 15:36)
 

Никто не знает?

  Ответить  
 
 автор: cheops   (30.07.2011 в 09:59)   письмо автору
 
   для: tAleks   (29.07.2011 в 15:36)
 

>Для постраничной навигации нужно посчитать кол-во записей в запросе, с фильтром по метке.
А что из себя представляет исходный запрос? Что он выбирает - метки всех статей с данным ключевым словом или метки какой-то одной статьи? Если последнее, то у вас не указано к какой статье относятся метки, если первое не очень понятно зачем вообще объединение?

  Ответить  
 
 автор: tAleks   (30.07.2011 в 11:31)   письмо автору
 
   для: cheops   (30.07.2011 в 09:59)
 

>А что из себя представляет исходный запрос? Что он выбирает - метки всех статей с данным ключевым словом или метки какой-то одной статьи? Если последнее, то у вас не указано к какой статье относятся метки, если первое не очень понятно зачем вообще объединение?

Исходный запрос выбирает сами статьи. Т.е. нужно вывести список статей. А метки храняться в таблице articles_tags. И косяк получается, если делается выборка статей с конкретной меткой.

Прмер запроса статей:


SELECT
    articles.id_article,
    articles.title,
    articles.body,
    articles_tags.tag,
    articles_tags.name AS tag_name
FROM articles
    LEFT JOIN articles_tags ON articles_tags.id_article = articles.id_article
WHERE articles_tags = 'spotr'
GROUP BY articles.id_article
ORDER BY $order $sort
LIMIT $start, $numrec";

  Ответить  
 
 автор: cheops   (30.07.2011 в 11:38)   письмо автору
 
   для: tAleks   (30.07.2011 в 11:31)
 

Т.е. вам нужны сами статьи? Тогда вместо COUNT(*) следует использовать COUNT(articles.id_article), а еще лучше COUNT(DISTINCT articles.id_article), тогда вы получите количество уникальных статей, для которых указано текущее ключевое слово.

  Ответить  
 
 автор: tAleks   (30.07.2011 в 12:21)   письмо автору
 
   для: cheops   (30.07.2011 в 11:38)
 

Спасибо! То, что надо!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования