Php MYSQL:有条件地向表中添加和更新临时列
我正在写一个标签系统 我有一个标签表,还有一个完整的标签项,由标签项ID和标签ID组成 我正在编写一个获取脚本,该脚本将为数据生成一些复选框,以便我可以轻松地可视化/编辑给定项的标记 我想添加一个名为checked的临时值,然后在标记表中存在一个提供的条目ID的条件下,它有这个标记,然后在我的表中将temp check值设置为truePhp MYSQL:有条件地向表中添加和更新临时列,php,mysql,Php,Mysql,我正在写一个标签系统 我有一个标签表,还有一个完整的标签项,由标签项ID和标签ID组成 我正在编写一个获取脚本,该脚本将为数据生成一些复选框,以便我可以轻松地可视化/编辑给定项的标记 我想添加一个名为checked的临时值,然后在标记表中存在一个提供的条目ID的条件下,它有这个标记,然后在我的表中将temp check值设置为true SELECT t.name AS name, t.id AS id, '0' AS checked FROM tags t IF( id IN (SELECT
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错误,不起作用。我没有足够的经验来判断这是否真的是一个坏主意,甚至它是否可行。任何输入都将不胜感激。您不需要更新,您可以使用CASE表达式测试tags.id是否在tagged表中找到,并将其放入选中的临时列中,类似于以下内容:
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;
| ID | NAME | CHECKED |
-----------------------
| 1 | a | 1 |
| 2 | b | 0 |
| 3 | c | 1 |
| 4 | d | 0 |
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;
请在此处查看它的实际操作:
这将为您提供如下信息:
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;
| ID | NAME | CHECKED |
-----------------------
| 1 | a | 1 |
| 2 | b | 0 |
| 3 | c | 1 |
| 4 | d | 0 |
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;
更新:
如果要将条件添加到标记表中,如WHERE workshop_id=26,请将其添加到子查询中,而不是左侧联接条件,如下所示:
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;
| ID | NAME | CHECKED |
-----------------------
| 1 | a | 1 |
| 2 | b | 0 |
| 3 | c | 1 |
| 4 | d | 0 |
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;
您不需要更新,可以使用CASE表达式来测试tags.id是否在taged表中找到,并将其放入选中的临时列中,如下所示:
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;
| ID | NAME | CHECKED |
-----------------------
| 1 | a | 1 |
| 2 | b | 0 |
| 3 | c | 1 |
| 4 | d | 0 |
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;
请在此处查看它的实际操作:
这将为您提供如下信息:
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;
| ID | NAME | CHECKED |
-----------------------
| 1 | a | 1 |
| 2 | b | 0 |
| 3 | c | 1 |
| 4 | d | 0 |
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;
更新:
如果要将条件添加到标记表中,如WHERE workshop_id=26,请将其添加到子查询中,而不是左侧联接条件,如下所示:
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;
| ID | NAME | CHECKED |
-----------------------
| 1 | a | 1 |
| 2 | b | 0 |
| 3 | c | 1 |
| 4 | d | 0 |
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;
我们可以有两个表的简化示例,每个表中有几行示例数据吗?我们可以有两个表的简化示例,每个表中有几行示例数据吗?选择t1.id作为id,t1.name作为name,当t2.workshop_id为NULL时,则0否则1结束,从标记为t1的标记中选中左连接选择*从标记为t2的26=t2.workshop_id;这与我想要的非常接近,但我需要根据外部id进行筛选…我尝试了硬编码26,但它只生成了一个巨大的表…如果我这样尝试,您的解决方案仍然有效吗?选择t1.id作为id,t1.name作为名称,当t2.workshop_id为NULL时,则0否则1结束,从标记为t1的标记中选中左连接选择*从标记为t2的26=t2.workshop_id;这非常接近我想要的,但我需要根据外部id将其过滤掉…我尝试硬编码26,但它只生成一个巨大的表…如果我这样尝试,您的解决方案仍然有效吗?