find_in_set返回不同的值

时间:2017-07-05 14:18:56

标签: mysql

我有一张包含此声明的表格:

CREATE TABLE foobar (
  id int(11) NOT NULL AUTO_INCREMENT,
  dow set('q','w','e','r','t','y', 'u') NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT;

使用这些值:

 id,   dow
'1', '1,3,6'
'1', '2,4,7'

那些查询会返回不同的值。

SELECT dow, FIND_IN_SET('4', dow) FROM (SELECT * from pippo.pluto) as B;

SELECT dow, FIND_IN_SET('4', dow) FROM pippo.pluto as B;

第一个查询返回这些结果:

'1,3,6', '0'
'2,4,7', '2'

第二个查询返回结果:

'1,3,6', '0'
'2,4,7', '4'

为什么?

针对5.6和5.7 mysql版本进行了测试。

编辑:

如果我使用mysql视图,则此行为保持不变。

CREATE VIEW selectInner AS SELECT dow, FIND_IN_SET('r', dow) FROM (SELECT * from pippo.foobar) as B;
CREATE VIEW selectDirect AS SELECT dow, FIND_IN_SET('r', dow) FROM pippo.foobar as B;

1 个答案:

答案 0 :(得分:0)

这里有两件事情在互动:

  • “如果第一个参数是常量字符串,第二个参数是类型SET的列,则FIND_IN_SET()函数将被优化为使用位算术。”每FIND_IN_SET docs
  • 两个查询中的一个直接在表上运行,第二个查询在派生表上运行。

行为证明了这一点:

  • 直接在表上操作(其中dow引用该表的元数据中定义的列)时,FIND_IN_SET将返回列定义中条目的索引/ LI>
  • 在派生表(其中dow引用派生列)上运行时,FIND_IN_SET将返回派生
  • 中条目的索引

如果你搜索例如,这是很清楚的。包含y的列中的uq,e,y,u:在直接查询表格时会得到6和7,其中dowSET,其中包含q,w,e,r,t,y,u FIND_IN_SET 1}}和dow使用按位优化;但在搜索派生表时为3和4,其中q,e,y,u是包含该行 XElement element; XDocument xdoc = XDocument.Load(FileLoc); element = xdoc.Elements(XName.Get("gold", "http://schemas.datacontract.org/2004/07/DumaLegend")).Single(); element.Value = Gold.Text; 的字符串。