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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Выборка статей и меток к ним

Сообщения:  [1-10]   [11-17] 

 
 автор: cheops   (28.04.2011 в 17:19)   письмо автору
 
   для: tAleks   (28.04.2011 в 17:06)
 

>Что за кэширующая таблица? Первый раз слышу. Как ее создавать?
Это обычная таблица, пусть вам нужно связать пользователей и их статьи, создаете таблицу, где пользователям соответствуют их статьи
id_user - articles
45 - 2, 8, 10, 15, 17, 22
46 - 1, 9, 11, 18, 36
47 - 4, 12, 23, 37
Как только пользователь добавляет или удаляет статью, вы уничтожаете для него запись в этой таблице и расчитываете её по новой. Потребовались вас статьи пользователя 46, разбросанные по множеству разделов, вместо того чтобы строить многоэтажные запросы вы извлекаете запись из этой таблице (благодаря индексированию это будет очень быстро) и формируете запрос
SELECT * FROM tbl WEHRE id_article IN (1, 9, 11, 18, 36)
т.е. вместо того, чтобы мучительно составлять список каждый раз, вы держите его наготове заранее вычисленным в специальной таблице. И таких таблиц под наиболее трудоекие задачи можно построить несколько. Да у вас немного замедляется и затрудняется процесс добавления статьи и усложняется структура базы данных. Однако вставка - это редкая операция, а выборка частая.

  Ответить  
 
 автор: tAleks   (28.04.2011 в 17:06)   письмо автору
 
   для: cheops   (28.04.2011 в 15:36)
 

Совсем забыл... еще же группы... статьи должны быть рассортированы по группам, у них должны быть метки, и еще по пользователям.... это ж, капец, вообще 5-и табличный запрос получается....

Как их лучше будет проиндексировать, в таком случае?

> вы же всегда можете создать кэширующую таблицу

Что за кэширующая таблица? Первый раз слышу. Как ее создавать?

  Ответить  
 
 автор: cheops   (28.04.2011 в 15:36)   письмо автору
 
   для: tAleks   (28.04.2011 в 15:32)
 

Как проиндексируете...

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

  Ответить  
 
 автор: tAleks   (28.04.2011 в 15:32)   письмо автору
 
   для: cheops   (27.04.2011 в 14:31)
 

Еще, по задаче нужно сделать связку статей и пользователей. Т.е. на определенных субодменах (которые принадлежат консультантам) выводить статьи только этих консультантов.

Четырехтабличный запрос (если к этому запросу еще прибавить связку пользователей) это будет вообще жесть? Или нормально?

  Ответить  
 
 автор: cheops   (27.04.2011 в 14:31)   письмо автору
 
   для: tAleks   (27.04.2011 в 14:24)
 

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

  Ответить  
 
 автор: tAleks   (27.04.2011 в 14:24)   письмо автору
 
   для: cheops   (27.04.2011 в 10:51)
 

Спасибо!

Это будет быстрей чем кореллированный запрос?

  Ответить  
 
 автор: tAleks   (27.04.2011 в 14:24)   письмо автору
 
   для: cheops   (27.04.2011 в 10:51)
 

Спасибо!

Это будет быстрей чем кореллированный запрос?

  Ответить  
 
 автор: cheops   (27.04.2011 в 10:51)   письмо автору
 
   для: tAleks   (27.04.2011 в 08:25)
 

Это в поле labels? Используйте ключевое слово DISTINCT
SELECT 
    articles.id_article, 
    articles.id_group, 
    articles.title, 
    articles.showhide, 
    articles.datetime_add, 
    articles_labels.label, 
    GROUP_CONCAT(DISTINCT labels.label) AS labels 
FROM articles 
    LEFT JOIN articles_labels ON articles_labels.id_article = articles.id_article 
    LEFT JOIN articles_labels AS labels ON labels.id_article = articles.id_article 
GROUP BY articles.id_article 
ORDER BY datetime_add DESC 
LIMIT 0, 15

  Ответить  
 
 автор: tAleks   (27.04.2011 в 08:25)   письмо автору
 
   для: cheops   (26.04.2011 в 22:54)
 

Добавил еще одну таблицу, так:

SELECT
    articles.id_article,
    articles.id_group,
    articles.title,
    articles.showhide,
    articles.datetime_add,
    articles_labels.label,
    GROUP_CONCAT(labels.label) AS labels
FROM articles
    LEFT JOIN articles_labels ON articles_labels.id_article = articles.id_article
    LEFT JOIN articles_labels AS labels ON labels.id_article = articles.id_article
GROUP BY articles.id_article
ORDER BY datetime_add DESC
LIMIT 0, 15


Но при таком запросе, список меток извлекается как-то странно. Если метка одна, то все нормально. Если меток две - то они извлекаеются дважды, если три - то трижды.

Может я че-то напутал?

PS.: Таблицу labels переименовал в articles_labels и грохнул из нее колонку type.

  Ответить  
 
 автор: cheops   (26.04.2011 в 22:54)   письмо автору
 
   для: tAleks   (26.04.2011 в 17:33)
 

Тогда наверное придется возвращаться к коррелированным подзапросам или вводить третью таблицу labels (назначая ей алиас) специально для извлечения меток.

  Ответить  

Сообщения:  [1-10]   [11-17] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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