2

问题:我有一个 MySQL 数据库表,其中包含文章编号和与文章相关的 2 个参数:

article_no | parameter1 | parameter2

1111111    | false      | false

2111111    | true       | true

1222222    | false      | false

2222222    | false      | false

文章由2个文章编号表示,区别是一个以“1”开头,另一个以“2”开头。

问题:如果相关的“2”-文章编号的parameter1为真,则所有以“1”开头的文章编号的parameter2必须变为“true”。在上面的例子中,参数 2 的 1111111 必须变为“真”。有没有办法只用 sql 做到这一点?

4

3 回答 3

2

您可以通过一个UPDATE查询来实现,例如:

UPDATE 
  t AS l 
    LEFT JOIN t AS r 
      ON SUBSTR(l.article_no, 2)=SUBSTR(r.article_no, 2) 
      AND l.article_no LIKE '1%' 
      AND r.article_no LIKE '2%' 
SET 
  l.parameter2='true' 
WHERE 
  r.parameter1='true'
于 2013-10-03T07:46:28.827 回答
1

根据我的理解,您想使用以下条件更新参数 1 和 2:如果前缀为“1”则为“真”,如果前缀为“2”则为假。这是查询:

UPDATE article SET parameter1 = 'true', parameter2 = 'true' WHERE article_no LIKE '1%';

UPDATE article SET parameter1 = 'false', parameter2 = 'false' WHERE article_no LIKE '2%';

我假设你的桌子是article.

于 2013-10-03T07:40:21.870 回答
0

这是另一个答案

update 
    articles as a 
left join 
    articles as b
on 
    substring(a.article_no, 2) = substring(b.article_no, 2)
set 
    a.parameter2 = 'true'
where 
    a.artile_no like '1%' 
    and b.artile_no like '2%'
    and b.parameter2 = 'true';

顺便说一句,您已经提出了文章编号以“1”开头的行的问题 parameter2 必须变为 true ,前提parameter2 对于具有以“2”开头的 article_no 的相应行为 true。如果您不关心文章编号以“2”开头的行的 parameter2 的值,只需删除最后一个条件。

主要思想是您必须使用 substring() 函数和参数 2 进行比较。

 substring(a.article_no, 2) = substring(b.article_no,2)

可以使用子查询完成相同的操作,但使用左连接更具成本效益。

于 2013-10-03T08:13:31.013 回答