[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: По 5 записей на букву
kaww
Как выбрать данные из таблицы таким образом, чтобы было, например, по 5 записей с одинаковой первой буквой? Есть три таблицы:
Цитата
abc (chr_id, chr) values (1,а), (2,п)...(45, v)
pages (page_id, name) values (1, Page_), ...(5656, Какая-то страница)
abc_pages (row_id, chr_id, page_id)

Нужно как-то получить такой результат
Цитата
chr page_id coun_pages
f      1        45
f      2        45
........
e      989      12
e      990      12

где count_pages - количество страниц соответствующих chr
kaww
Всем спасибо) проблему решил добавив поле sort_index в abc_pages
Valick
kaww, не могли бы вы подробнее расписать решение проблемы, чтобы стала яснее сама проблема? smile.gif
хотя бы покажите запрос


_____________
Стимулятор ~yoomoney - 41001303250491
kaww
Хотя нет, такой способ нельзя использовать, т.к. выборка делается по условию
philya
SELECT chr.chr, pages.id
FROM pages, chr
JOIN (SELECT @a:=IF(@id!=idchr ,0,@a+1) AS a, @id:=idchr AS idchr, idpage
FROM abc_pages, (SELECT @a := 0, @id := 0) s1
ORDER BY idchr ASC) d ON a<4 AND d.idchr = chr.id AND d.idpage = pages.id


Но такой запрос будет долго работать, если у вас в таблицах очень много записей + здесь он не находит количество всех страниц для каждой буквы. Для этого, по-моему, лучше использовать отдельное поле в таблице chr
kaww
philya, Кол-во записей для буквы хранить не получится т.к. нужен поиск по данным(кол-во результатов различное). Пока не нашел способа работающего быстрее чем тупо запросы в цикле на каждую букву.
Valick
Цитата
не нашел способа работающего быстрее чем тупо запросы в цикле

благо букв в алфавите не так много, а вот китайцам печалька sad.gif
может наконец откроете "страшную тайну золотого ключика" и опишете ТЗ подробнее ?
а не так чтоб "жизнь начиналась с середины..." smile.gif
___
просто задача мне показалась гораздо более интересной чем http://softtime.ru/forum/read.php?id_forum=3&id_theme=88771 там логика запроса узкоспециализированна, да и есть подозрение, что БД спроектировна через жопу, и необходимость такого запроса следствие "проектировки"

_____________
Стимулятор ~yoomoney - 41001303250491
kaww
Цитата
благо букв в алфавите не так много, а вот китайцам печалька

дело в том что алфавит используется не один, теоретически может быть любой символ (^\d^-\w), по этому нужно все таки найти какое-то решение
Цитата
может наконец откроете "страшную тайну золотого ключика" и опишете ТЗ подробнее ?

Вроде как мог расписал. Суть в том, что есть таблица с алфавитом (chr_id, chr), таблица со списком страниц, (page_id,name, cjntent...) и таблица для хранения связей (row_id, page_id, chr_id). Нужно вывести данные в таком виде
Цитата
А (145)
абрикос
ананас
Алень

Б (2223)
банан
баран
буратино

etc.
Valick
это я понял, вот это что?
Цитата
Кол-во записей для буквы хранить не получится т.к. нужен поиск по данным(кол-во результатов различное)

подробнее про поиск
искать надо что-то общее у них, в противном случае от большого количества запросов вам не избавится

_____________
Стимулятор ~yoomoney - 41001303250491
kaww
Цитата
подробнее про поиск
ну т.е. where pages.name like '%some text%'
philya
Ну тогда добавь в селект вот это:
d.a

для каждой буквы этот столбец считается отдельно, поэтому его максимально значение, увеличенное на 1 и будет количеством страниц

Ерунду написал)
Joker
я так понимаю база MySQL ?)
kaww
Joker, да, MySQL
inpost
LIKE '%word%' - индексы работать не будут smile.gif
LIKE 'word%' - будут
Стоит это учесть. В последних версиях mysql innodb поддерживает полнотекстовый индекс, тоже возьми во внимание.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
philya
Если нигде не ошибся, то вот:
SELECT d.a, c.cnt, chr.chr, pages.name
FROM pages, chr
JOIN (SELECT @a:=IF(@id!=idchr ,0,@a+1) AS a, @id:=idchr AS idchr, idpage
FROM pages, abc_pages, (SELECT @a := 0, @id := 0) s1 WHERE abc_pages.idpage = pages.id AND pages.name LIKE "%а%"
ORDER BY idchr ASC) d
JOIN (SELECT COUNT(chr.id) AS cnt, chr.id
FROM chr, pages, abc_pages
WHERE chr.id = abc_pages.idchr AND pages.id = abc_pages.`idpage` AND pages.name LIKE "%а%" GROUP BY chr.id) c

ON a<4 AND d.idchr = c.id AND d.idchr = chr.id AND d.idpage = pages.id


но изврат, конечно, полный
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.