Страница 1 из 1
Помогите сформировать SQL-запрос
Добавлено: 2009-07-03 10:01:29
kozak
Привет всем кто вместо того чтобы плавиться на море под солнцем, впитывает излучение он монитора!
Вот мой трабл:
Есть таблица my_tab с колонкой my_col
Код: Выделить всё
+--my_col--------+
| AA.02.6.6.1 |
| AA.02.6.6.1.1 |
| AA.02.6.6.1.2 |
| AA.02.6.6.1.3 |
| AA.02.6.6.1.4 |
| AA.02.6.6.1.5 |
| AA.02.6.6.1.6 |
| AA.02.6.6.1.7 |
| AA.02.6.6.1.8 |
| AA.02.6.6.1.9 |
| AA.02.6.6.1.10 | - здесь начинаются проблемы с [[:digit:]] (максимум число 9)
| AA.02.6.6.2 |
| AA.02.6.6.2.1 |
| AA.02.6.6.2.2 |
| AA.02.6.6.2.3 |
+----------------+
Как правильно сформулировать запрос чтобы выбрать последнюю запись из колонки my_col по маске AA.02.6.6.1.PATT
где PATT - последняя запись в таблице
т.е. чтоб при запросе по маске AA.02.6.6.1 вывело AA.02.6.6.1.10
Вот моя безрезультатная попытка:
Код: Выделить всё
$query = "SELECT my_col FROM my_db.my_tab
WHERE my_col REGEXP '^AA.02.6.6.1.[[:digit:]]+$'
ORDER BY my_col DESC LIMIT 1";
Выдает максимальное число PATT = "9"

Re: Помогите сформировать SQL-запрос
Добавлено: 2009-07-03 11:14:06
hizel
для начала просто точка(.) рассматривается как любой символ, я бы ее забрейкил палочкой(\)
Re: Помогите сформировать SQL-запрос
Добавлено: 2009-07-03 13:05:10
kozak
Нет. То же самое. Максимум выбирает AA.02.6.6.1.9...
Re: Помогите сформировать SQL-запрос
Добавлено: 2009-07-03 15:02:27
E-Wind
Наманьячил ))
Код: Выделить всё
SELECT CONVERT(SUBSTRING_INDEX( SUBSTRING_INDEX(my_col,'.',6), '.', -1),UNSIGNED) as my_idx, id, my_col FROM `tbl` WHERE (my_col LIKE 'AA.02.6.6.1.%') order by my_idx desc LIMIT 1
Результат
А теперь давайте упрощать )
Пока работаем со строкой - 9 > 10 )) от этого отталкиваемся...
"Дамп":
Код: Выделить всё
id my_col
1 AA.02.6.6.1
2 AA.02.6.6.1.1
3 AA.02.6.6.1.2
4 AA.02.6.6.1.3
5 AA.02.6.6.1.4
6 AA.02.6.6.1.5
7 AA.02.6.6.1.6
8 AA.02.6.6.1.7
9 AA.02.6.6.1.8
10 AA.02.6.6.1.9
11 AA.02.6.6.1.10
12 AA.02.6.6.2
13 AA.02.6.6.2.1
14 AA.02.6.6.2.2
15 AA.02.6.6.2.3
Re: Помогите сформировать SQL-запрос
Добавлено: 2009-07-03 16:54:03
kozak
cat THNX > E-Wind
Но теперь при маске
AA.02.6.6.1 работает на ура, но при маске
AA.02.6.6 не выдает
AA.02.6.6.2 а выдает тот же результат, что и для
AA.02.6.6.1 =
AA.02.6.6.1.10 
Re: Помогите сформировать SQL-запрос
Добавлено: 2009-07-03 17:02:40
kozak
Оп-оп-оп!!!
Получилось. Выбирал не ту колонку...
Вот лапух...
Спасибо за помощь!!!
Re: Помогите сформировать SQL-запрос
Добавлено: 2009-07-03 20:14:12
zg
E-Wind писал(а):Наманьячил ))
угу, я бы так сделал
Код: Выделить всё
mysql> select mask, replace(mask,'AA.02.6.6.1.','')+0 from test where mask LIKE "AA.02.6.6.1%";
+----------------+-----------------------------------+
| mask | replace(mask,'AA.02.6.6.1.','')+0 |
+----------------+-----------------------------------+
| AA.02.6.6.1 | 0 |
| AA.02.6.6.1.1 | 1 |
| AA.02.6.6.1.2 | 2 |
| AA.02.6.6.1.3 | 3 |
| AA.02.6.6.1.4 | 4 |
| AA.02.6.6.1.5 | 5 |
| AA.02.6.6.1.6 | 6 |
| AA.02.6.6.1.7 | 7 |
| AA.02.6.6.1.8 | 8 |
| AA.02.6.6.1.9 | 9 |
| AA.02.6.6.1.10 | 10 |
+----------------+-----------------------------------+
11 rows in set (0.00 sec)
mysql>
суть ясна? или пояснить

Re: Помогите сформировать SQL-запрос
Добавлено: 2009-07-05 13:31:25
kozak
Уже ясна. 5+ за оптимизацию.

Функция GROUP_CONCAT
Добавлено: 2011-04-05 21:27:38
kozak
Таблица все та-же...)
Код: Выделить всё
+--my_col----------+-my_name-
| AA.02.6.6.1 | A
| AA.02.6.6.1.1 | B
| AA.02.6.6.1.2 | C
| AA.02.6.6.1.3 | D
| AA.02.6.6.1.4 | E
| AA.02.6.6.1.5 | F
| AA.02.6.6.1.50 | G
| AA.02.6.6.1.51 | H
| AA.02.6.6.1.52 | I
....
При выборке
Код: Выделить всё
SELECT GROUP_CONCAT(`my_name` ORDER BY `my_col` ASC SEPARATOR '+') FROM table WHERE 'AA.02.6.6.1.51' LIKE CONCAT(my_col,'%')
выдает не "H+A" а "H+F+A" т.к. строка "AA.02.6.6.1.5" тоже попадает под это условие.
Подскажите, как сгруппировать строки поочередно, групируя их по сумме "." (точек)?
Результатом, должна стать строка "H+A".
Спасибо!