Как отобразить дни на странице просмотра, если число дней в одном столбце кратно? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть две-три таблицы.Во-первых, дни, а во вторую таблицу я вставляю данные

days_id days_name
    1   Monday
    2   Tuesday
    3   Wednesday
    4   Thursday
    5   Friday
    6   Saturday
    7   Sunday

Во вторую таблицу

  id    | days_id  
  1     | 2,3,5
  2     | 1,3,7
  3     | 1 
  4     | 2 

Я знаю, это неправильный способ вставки нескольких данных в столбецно все же я должен сделать это.Теперь моя проблема в том, что мне нужно отобразить список в таблице.

Примечание (это не 100% мой вывод. Я просто хочу знать, как отображать дни)

    id    | days_id  
    1     | Tuesday,Wednesday,Friday
    2     | Monday,Wednesday,Sunday
    3     | Monday 
    4     | Tuesday

Какой запрос я должен использовать?Я пробовал ниже запрос, но он показывает только первый день.

SELECT *
FROM `b_list`
JOIN `days` ON `b_list`.`b_days` = `days`.`days_id`
WHERE `b_list`.`b_status` = 1

Пометка CodeIgniter, потому что я использую его.Не могли бы вы помочь мне в этом?

$result = $this->db->where(['b_list.batch_status'=>1])
            ->select('*, group_concat(days_name ORDER BY days_id ASC) as days_list')
            ->from('b_list')
            ->join('days','FIND_IN_SET(days.days_id,b_list.days_id)')
            ->get()
            ->result();

и, используя приведенный выше код, я получаю следующий запрос

SELECT *, group_concat(days.days_name ORDER BY days_id ASC) as days_list FROM `b_list` JOIN `days` USING (FIND_IN_SET(days.days_id,b_list.days_id)) WHERE `b_list`.`batch_status` = 1

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Вы можете использовать FIND_IN_SET () , чтобы присоединиться к списку, и GROUP_CONCAT () , чтобы объединить их в строку:

SELECT b_list.id, group_concat(days_name ORDER BY days_id ASC) as days_list
FROM b_list
INNER JOIN days ON FIND_IN_SET(days.days_id, b_list.days_ids)
GROUP BY b_list.id;

example output

DEMO: https://www.db -fiddle.com / f / e9fCJRNiSPwk8jQtFWuEFB / 4

0 голосов
/ 14 февраля 2019

Это ужасно.Не делай этого.Но если вы должны:

DROP TABLE terrible_idea;

CREATE TABLE terrible_idea
(id SERIAL PRIMARY KEY
,days_id  VARCHAR(255) NOT NULL
);

INSERT INTO terrible_idea VALUES
(1,'2,3,5'),
(2,'1,3,7'),
(3,'1'),
(4,'2');

CREATE TABLE hacky_solution
(i SERIAL PRIMARY KEY);

INSERT INTO hacky_solution VALUES (1),(2),(3),(4),(5),(6),(7);

SELECT id, STR_TO_DATE(FIND_IN_SET(y.i,x.days_id),'%W')m FROM terrible_idea x,hacky_solution y;

SELECT id
     , SUBSTRING_INDEX(SUBSTRING_INDEX('Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday'
                     ,','
                     ,FIND_IN_SET(y.i,CONCAT(',',x.days_id))
                     ),',',-1)m 
                  FROM terrible_idea x,hacky_solution y
                  HAVING m <> '';
SELECT id
      , SUBSTRING_INDEX(SUBSTRING_INDEX('Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday'
                      ,','
                      ,FIND_IN_SET(y.i,CONCAT(',',x.days_id))
                      ),',',-1)m
                   FROM terrible_idea x,hacky_solution y
                   HAVING m <> '';
+----+-----------+
| id | m         |
+----+-----------+
|  2 | Tuesday   |
|  3 | Tuesday   |
|  1 | Tuesday   |
|  4 | Tuesday   |
|  1 | Wednesday |
|  2 | Wednesday |
|  1 | Thursday  |
|  2 | Thursday  |
+----+-----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...