Mysql
 sql >> база данни >  >> RDS >> Mysql

Може ли това да се направи в MySQL заявка или трябва да се направи в PHP? (сървърна страна)

Това може да се направи в sql . Един от начините би бил да използвате "помощна таблица" само с цели числа, към които можете да join вашите данни срещу, за да получите реда си няколко пъти и след това да извлечете само n -ти поделемент.

Опитайте това:

-- helper table with a listof integers from 1 to 10
create table _int_1_10 (id int primary key);
insert into _int_1_10 (id) 
values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);

-- some example data 
create table test_strexplode (
   id int primary key, 
   space_value_1 varchar(200),
   space_value_2 varchar(200)
);

insert into test_strexplode (id, space_value_1, space_value_2)
values (1, 'row 1', 'March 3,March 5,March 6 March 1,March 2 Feb 27'),
       (2, 'row 2', 'March 3,,March 5'),
       (3, 'row 3', '');

select space_value_1, 
  _int_1_10.id,
  -- extracts the "_int_1_10.id"th element
  SUBSTRING_INDEX(SUBSTRING_INDEX(
       space_value_2,',',_int_1_10.id),',',-1) as subentry
from test_strexplode
join _int_1_10 
on _int_1_10.id <= 
   -- number of elements in your string (= number of "," + 1)
   char_length(space_value_2) - char_length(replace(space_value_2, ',', '')) + 1
order by test_strexplode.id, _int_1_10.id;

Това ще ви даде:

+---------------+----+-----------------+
| space_value_1 | id | subentry        |
+---------------+----+-----------------+
| row 1         | 1  | March 3         | 
| row 1         | 2  | March 5         |
| row 1         | 3  | March 6 March 1 |
| row 1         | 4  | March 2 Feb 27  |
| row 2         | 1  | March 3         |
| row 2         | 2  |                 |
| row 2         | 3  | March 5         |
| row 3         | 1  |                 |
+---------------+----+-----------------+

Използвах вашите примерни данни, в които липсват някои , , поради което резултатът съдържа напр. March 2 Feb 27 . Също така имайте предвид, че някои подзаписи са празни (тъй като моите примерни данни включват празни записи); може или не може да искате да ги филтрирате. Вашата таблица с цели числа очевидно ще трябва да съдържа числа поне до максималния брой елементи, които очаквате да имате във всеки от вашите редове (и ако съдържа 0 или отрицателни числа, филтрирайте ги в on -клауза).

substring_index(str,delim,count) връща подниза от низ str преди count срещания на разделителя delim . Пълният отчет за subentry за положително число ще върне или _int_1_10.id -ти елемент или, ако низът има по-малко елементи, последния елемент.

on -клауза по този начин изчислява броя на елементите (като брои броя на , ), за да предотвратите получаването на последния елемент няколко пъти. Ако вашият низ не съдържа празни елементи (като ,, в моите примерни данни), нямате нужда от тази част, но можете да добавите празен елемент, за да маркирате края на списъка.

Можете да приложите този код към целия си набор от резултати, напр. чрез използване на

...
from (select ... 
         space1_1_value as space_value_1,
         space1_2_value as space_value_2
      ...
      union all ... union all ... ) as test_strexplode 
join _int_1_10 ...

Ще работи, но може да е бавно. Не може да използва индекс на space*_2_value -колони и ще трябва да направи много съединяване и оценка на низове. Не можете да направите много по въпроса, освен да нормализирате данните си.

Ако е полезно да направите това в sql вероятно ще зависи от това какво правите с данните. Ако просто възнамерявате да го покажете в html-таблица на уеб страница, може да е едновременно по-лесно и по-бързо просто да преминете през масива в php . За сортиране, филтриране или join вашия набор от резултати, вероятно е много по-лесно за внедряване (и вероятно по-бързо) в sql , може би дори ако го използвате в рамка. Ако ще актуализирате стойностите, ще бъде много по-лесно да го направите в php , тъй като най-вероятно ще е бъркотия в sql (на този набор от резултати).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на MySQL DATE_ADD, 5-дневен интервал

  2. MySQL INSERT изразите по-бавни ли са в огромни таблици?

  3. Как мога да създам външни ключове от текстов тип в MariaDB или MySQL?

  4. Оптимизиране на MySQL заявки с тежки съединения

  5. Обща грешка:не можа да се извика конструктор на клас'