Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка цепочки через JOIN / 8 сообщений из 8, страница 1 из 1
07.10.2013, 16:41:38
    #38419158
Ninazu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка цепочки через JOIN
Собственно структура имеет вид цепочки(не дерево, только один потомок). Выбирать можно в цикле на PHP. Но есть два минуса.
1. Куча обращений к БД
2. Не знаю как организовать пагинацию без выборки всех полей предварительно.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- WHERE `id_group`=7
--
-- |-------------------------| 
-- |        field_value      | 
-- |----|----------|---------| 
-- | id | id_group | id_prev |
-- |----|----------|---------| 
-- |  4 |    7     |   NULL  |
-- |  5 |    7     |    4    |
-- |  6 |    7     |    5    |
-- |  7 |    7     |    6    |
-- |----|----------|---------| 
-- 
-- 4 -> 5 -> 6 -> 7 (Limit 10,20)

Можно как-то сделать через JOIN, так чтоб за один раз можно было забрать с лимитами? Гуглил, что можно еще процедуру в самом запросе написать, но что-то делаю не так. Нашел пример функции, думаю попробую расширить кругозор.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DELIMITER //
CREATE PROCEDURE get_max_levels()
BEGIN
SET @lowest_parent := 
 (SELECT MAX(parent) FROM People WHERE parent IS NOT NULL);
SET @levels := 1;
SET @current_parent = @lowest_parent;
WHILE @current_parent IS NOT NULL DO
 SET @current_parent := 
 (SELECT parent FROM People WHERE person_id = @current_parent);
 SET @levels := @levels + 1;
END WHILE;
SELECT @levels;
END //



Но copypaste не помог. Куча ошибок. Что не так делаю? Или phpMyAdmin не может прожевать процедуру?

автор#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '//' at line 13
...
Рейтинг: 0 / 0
07.10.2013, 16:44:59
    #38419165
Ninazu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка цепочки через JOIN
авторВерсия сервера: 5.6.13-log - MySQL Community Server (GPL)
Версия протокола: 10
Версия клиента базы данных: libmysql - mysqlnd 5.0.10 - 20111026
PHP расширение: mysqli
phpMyAdmin версии: 4.0.5
...
Рейтинг: 0 / 0
07.10.2013, 18:11:32
    #38419320
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка цепочки через JOIN
Структура данных - где?
...
Рейтинг: 0 / 0
07.10.2013, 23:21:15
    #38419537
Ninazu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка цепочки через JOIN
Akina,
Так я ведь в первом посте нарисовал структуру)

Могу и в командном виде. =)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE IF NOT EXISTS `test_tb` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_group` int(11) NOT NULL,
  `id_prev` int(11) DEFAULT NULL,
  `title` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id_prev` (`id_prev`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;

INSERT INTO `test_tb` (`id`, `id_group`, `id_prev`, `title`) VALUES
(1, 1, NULL, 'Первый'),
(2, 2, NULL, '#1'),
(3, 2, 2, '#2'),
(4, 1, 7, 'Пятый'),
(5, 1, 1, 'Второй'),
(6, 1, 5, 'Третий'),
(7, 1, 6, 'Четвертый');




Cейчас реализована такая функция.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    public function getChain($group){
        $id=$group;
        $index=1;
        while($id){
            // SELECT * FROM `test_tb` WHERE `id_prev`=`id` AND `id_group`=$group
            $id=$this->findByAttributes(array(
                'id_prev'=>$id->id,
                'id_group'=>$group,
            ));
            if($id){
                $result[]=$id;
            }
        }
        return $result;
    }

$Chain=getChain(1);



Результатом которой будет
Код: php
1.
2.
3.
4.
5.
(1, 1, NULL, 'Первый')
(5, 1, 1, 'Второй')
(6, 1, 5, 'Третий')
(7, 1, 6, 'Четвертый')
(4, 1, 7, 'Пятый')
...
Рейтинг: 0 / 0
08.10.2013, 09:00:14
    #38419690
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка цепочки через JOIN
NinazuТак я ведь в первом посте нарисовал структуруА мы по фотографии не лечим. Тем более что мы привыкли к тому, что нарисованное не всегда совпадает с имеющимся. Вот CREATE TABLE - это другое дело.

А теперь растолкуй, что всё-таки нужно... есть у меня подозрение, что тебе надо выборку группыЮ, сортированную в порядке связности, но нет подтверждения.
...
Рейтинг: 0 / 0
08.10.2013, 10:01:47
    #38419759
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка цепочки через JOIN
...
Рейтинг: 0 / 0
08.10.2013, 11:27:13
    #38419912
Ninazu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка цепочки через JOIN
Теперь подтверждение есть)) Да хотелось бы аналогичную реализацию функции, средствами MySQL
Akinaесть у меня подозрение, что тебе надо выборку группыЮ, сортированную в порядке связности, но нет подтверждения.

2Cygapb-007 , за ссылку спасибо! Изучу вечером)
...
Рейтинг: 0 / 0
08.10.2013, 11:29:37
    #38419916
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка цепочки через JOIN
NinazuТеперь подтверждение естьНу тогда ссылка уже дана.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка цепочки через JOIN / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]