Mysql 如果单列中的天数id为多个,如何在查看页面上显示天数?
我有两张三张桌子。第一个是天,我在第二个表中插入数据Mysql 如果单列中的天数id为多个,如何在查看页面上显示天数?,mysql,codeigniter-3,Mysql,Codeigniter 3,我有两张三张桌子。第一个是天,我在第二个表中插入数据 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 我知道,
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
这太糟糕了。不要这样做。但如果你必须:
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 |
+----+-----------+
您可以使用连接列表并将其连接为字符串:
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;
演示:@草莓,我的问题不同。我不是在问坏与否。这里有一个想法@草莓,我查过了。这不是我的解决办法。我正在努力寻找一个问题。但是你已经确定你知道这个问题的前提是有缺陷的@草莓,是的,是的,但我仍然要找到显示日期的解决方案请给我一些时间检查我试过选择*,按天分组名称顺序\u id ASC作为天列表从b_列表加入天查找在b_setdays中。天,b_list.b_天但我收到错误您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解可在“days.days\u id,b\u list.b\u days”附近使用的正确语法您的注释中的查询缺少连接中的on。它看起来也有一个额外的括号在最后。也许你应该在一个房间里试试。你可以用我现有的一个。实际上,我用的是CodeIgniter。不管怎样,把查询放在我们可以帮助你的地方对你来说是有意义的。我帮不上忙:当我省略了你工作示例中的随机部分时,它就不起作用了。使用CodeIgniter不会影响mysql查询。