|
|
|
| Решил перенести в новую тему
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 ) формируется не полностью, там только ФИО автора по которому идет выборка, а как составить, чтобы присутсвовали все авторы? | |
|
|
|
|
|
|
|
для: levsha
(04.02.2011 в 11:44)
| | 1. Строки должны быть подсчитаны заранее или постфактум? После выполнения запроса, можно вернуть количество строк при помощи запроса SELECT FOUND_ROWS() или функции mysql_affected_rows(). | |
|
|
|
|
|
|
|
для: cheops
(04.02.2011 в 11:57)
| | Просто я делаю постраничный вывод данных из бд. Естественно, чтобы мне рассчитать кол-во страниц, надо вначале подсчитать общее кол-во найденных строк.
Извлекается так много полей, потому что я потом в операторе where буду производить поиск, там будет MATCH ... AGAINST практически по все полям связанных таблиц
В этот запрос я потом добавлю LIMIT. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: cheops
(04.02.2011 в 12:37)
| | сейчас попробую ( данных у меня там практически нет( ) | |
|
|
|
|
|
|
|
для: levsha
(04.02.2011 в 12:43)
| | Надо бы побольше данных нагенерировать, а то можно пропустить какую-нибудь сложноопределяему ошибку, да и производительность этих многоэтажных запросов лучше тестировать сразу (полезно для выбора индексируемых полей, иногда получается что много мелких запросов работают быстрее). | |
|
|
|
|
|
|
|
для: cheops
(04.02.2011 в 12:45)
| | Спасибо, протестировал запросы, все работает | |
|
|
|
|
|
|
|
для: levsha
(04.02.2011 в 11:44)
| | 2. А обязательно всю эту информацию извлекать в одном запросе? Может воспользоваться несколькими запросами попроще? | |
|
|
|