我有两张桌子。
== Table structure for table all_tasks
|------
|Column|Type|Null|Default
|------
|id|int(11)|No|
|name|text|No|
|1|Task 1
|2|Task2
|3|Task 3
|4|Task 4
|5|Task 5
== Table structure for table task_list
|id|int(11)|No|
|task_list|varchar(50)|No|
== Dumping data for table task_list
|1|1,2,3
第一个表(all_taska)包含我的应用程序的所有任务,第二个表从第一个表中获取任务列表。
第二个表得到了列task_list
,它是数组格式(1,2,3,4,5)
我想创建<select> <option>
元素,其中所有任务都来自第一个表,其中选择的标签是insde&#34; task_list
&#34;第二个表中的数组。问题是查询结果无法返回costom列(&#34;在查询中选择&#34;)。
有人知道问题出在哪里吗?
SELECT a.id, a.name, IF(a.id IN b.task_list, 'no selected', 'selected') as Selected
FROM all_tasks as a LEFT JOIN task_list as b ON a.id IN (b.task_list)
答案 0 :(得分:1)
您无法使用IN
运算符来检查varchar
中的条件。如果要实现多对多关系,可以使用以下方案:
create table task_list (list_id int not null, task_id int not null)
使用此方案,您的查询可以通过以下方式实现:
select t.list_id, t.id, t.name,
if (tl.list_id is not null, 'selected', 'no selected') as Selected
from task_list tl right
join
(select distinct list_id, id, name from all_tasks join task_list) as t
on t.list_id = tl.list_id and t.id = tl.task_id;
答案 1 :(得分:0)
您永远不应该将数据存储为以逗号分隔的字符串,您应该考虑规范化。但是在这种情况下,您可以使用
select
t1.id ,
t1.name,
case
when t2.id is not null then 'selected' else 'no selected'
end as `selected`
from all_tasks t1
left join task_list t2 on find_in_set(t1.id,t2.task_list) > 0 ;