我正在写一个标签系统。
我有一个标签表,另一个是由标签项目ID和标签ID组成的标签项目。
我正在写一个取回脚本,将给数据生成一些复选框,所以我可以很容易地可视化/编辑给定项目的标签。
我的想法是添加一个临时值checked,然后在提供的Item ID出现在标记的表中(它有这个标记)的条件下,然后在我的表中将临时检查值设置为true。
SELECT t.name AS name, t.id AS id, '0' AS checked FROM tags t IF( id IN (SELECT DISTINCT tag_id FROM tagged WHERE workshop_id = $id) UPDATE t SET checked='1'
它只是抛出一个通用的sql错误,不工作。我没有足够的经验来判断这是否真的是个坏主意,或者它是否可行。
您不需要UPDATE
,您可以使用CASE
表达式来测试tags.id
是否在tagged
表中找到,并将其放在临时列checked
中,如下所示:
SELECT
t1.id AS id,
t1.name AS name,
CASE WHEN t2.tag_id IS NULL THEN 0 ELSE 1 END AS Checked
FROM tags AS t1
LEFT JOIN
(
SELECT *
FROM tagged
) AS t2 ON t1.id = t2.tag_id;
在这里看到它的作用:
- SQL Fiddle Demo
这会给你这样的结果:
| ID | NAME | CHECKED |
-----------------------
| 1 | a | 1 |
| 2 | b | 0 |
| 3 | c | 1 |
| 4 | d | 0 |
更新:
如果你想在tagged
表中添加一个条件,如WHERE workshop_id = 26
,请在子查询中添加它,而不是LEFT JOIN
条件,如下所示:
SELECT
t1.id AS id,
t1.name AS name,
CASE WHEN t2.tag_id IS NULL THEN 0 ELSE 1 END AS Checked
FROM tags AS t1
LEFT JOIN
(
SELECT *
FROM tagged
WHERE workshop_id = 26
) AS t2 ON t1.id = t2.tag_id;
- 更新SQL Fiddle Demo