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

Форум MySQL

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

 

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

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

тема: Сложная выборка данных
 
 автор: levsha   (04.02.2011 в 11:44)   письмо автору
 
 

Решил перенести в новую тему


SELECT *, r.name AS nameRubric, e.name AS nameEduprog, 
CONVERT(GROUP_CONCAT(a.id ORDER BY a.fio SEPARATOR ';') USING utf8) AS authors, 
GROUP_CONCAT(a.full_fio ORDER BY a.full_fio SEPARATOR ',') AS strAuthors 
FROM `library_materials` AS m 
LEFT JOIN `library_materials_authors` ma ON (m.id = ma.idMaterial) 
LEFT JOIN `library_authors` AS a ON (a.id = ma.idAuthor) 
LEFT JOIN `library_rubrics` AS r ON (r.id = m.idRubric) 
LEFT JOIN `library_eduprogs` AS e ON (e.id = m.idEduprog) 
WHERE ma.idAuthor=10
GROUP BY m.id ORDER BY m.`id` asc


1. Как мне составить запрос, чтобы подсчитать все строки возвращаемые этим запросом?
2. В выражении WHERE ma.idAuthor=10, то есть я выбираю все материалы одного автора. Но тогда поле strAuthors (в запросе: GROUP_CONCAT(a.full_fio ORDER BY a.full_fio SEPARATOR ',') AS strAuthors ) формируется не полностью, там только ФИО автора по которому идет выборка, а как составить, чтобы присутсвовали все авторы?

  Ответить  
 
 автор: cheops   (04.02.2011 в 11:57)   письмо автору
 
   для: levsha   (04.02.2011 в 11:44)
 

1. Строки должны быть подсчитаны заранее или постфактум? После выполнения запроса, можно вернуть количество строк при помощи запроса SELECT FOUND_ROWS() или функции mysql_affected_rows().

  Ответить  
 
 автор: levsha   (04.02.2011 в 12:10)   письмо автору
 
   для: cheops   (04.02.2011 в 11:57)
 

Просто я делаю постраничный вывод данных из бд. Естественно, чтобы мне рассчитать кол-во страниц, надо вначале подсчитать общее кол-во найденных строк.
Извлекается так много полей, потому что я потом в операторе where буду производить поиск, там будет MATCH ... AGAINST практически по все полям связанных таблиц

В этот запрос я потом добавлю LIMIT.

  Ответить  
 
 автор: cheops   (04.02.2011 в 12:37)   письмо автору
 
   для: levsha   (04.02.2011 в 12:10)
 

Можно попробовать как-то так (но нужно проверить на реальном дампе)
SELECT COUNT(DISTINCT m.id) 
FROM `library_materials` AS m  
LEFT JOIN `library_materials_authors` ma ON (m.id = ma.idMaterial)  
LEFT JOIN `library_authors` AS a ON (a.id = ma.idAuthor)  
LEFT JOIN `library_rubrics` AS r ON (r.id = m.idRubric)  
LEFT JOIN `library_eduprogs` AS e ON (e.id = m.idEduprog)  
WHERE ma.idAuthor=10

Собственно из-за использования LEFT JOIN, даже должен срабатывать запрос попроще
SELECT COUNT(DISTINCT m.id) 
FROM `library_materials` AS m  
LEFT JOIN `library_materials_authors` ma ON (m.id = ma.idMaterial)  
WHERE ma.idAuthor=10

  Ответить  
 
 автор: levsha   (04.02.2011 в 12:43)   письмо автору
 
   для: cheops   (04.02.2011 в 12:37)
 

сейчас попробую ( данных у меня там практически нет( )

  Ответить  
 
 автор: cheops   (04.02.2011 в 12:45)   письмо автору
 
   для: levsha   (04.02.2011 в 12:43)
 

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

  Ответить  
 
 автор: levsha   (04.02.2011 в 20:57)   письмо автору
 
   для: cheops   (04.02.2011 в 12:45)
 

Спасибо, протестировал запросы, все работает

  Ответить  
 
 автор: cheops   (04.02.2011 в 11:59)   письмо автору
 
   для: levsha   (04.02.2011 в 11:44)
 

2. А обязательно всю эту информацию извлекать в одном запросе? Может воспользоваться несколькими запросами попроще?

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

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