【发布时间】:2015-07-01 08:04:12
【问题描述】:
假设我有一个表 (tableA),其中有一列 Kwaliteit,它将包含一个代表一些字符串值的 int 值 (0, 1, 2, 3)。
这些字符串值被序列化存储在另一个表 (tableB) 中,如下所示:
a:4:{i:0;s:4:"Goed";i:1;s:5:"Matig";i:2;s:6:"Slecht";i:3;s:12:"Afgeschreven";}
这将给出一个这样的 PHP 数组:
Array
(
[0] => Goed
[1] => Matig
[2] => Slecht
[3] => Afgeschreven
)
问题是,我想过滤Afgeschreven。所以我将它插入到查询的LIKE 部分,但这不起作用,因为tableA 中有一个int 而不是string。
如何绕过这个问题?我可以用字符串值临时更改列值来进行过滤吗?
编辑
这是tableA(Kist)的结构
CREATE TABLE IF NOT EXISTS `Kist` (
`idKist` int(11) NOT NULL AUTO_INCREMENT,
`idKistType` int(11) NOT NULL,
`Tag1` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`Tag2` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`VisueelNr` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`Bouwjaar` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`kwaliteit` tinyint(1) NOT NULL,
`Actief` tinyint(1) NOT NULL,
PRIMARY KEY (`idKist`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=982 ;
INSERT INTO `Kist` (`idKist`, `idKistType`, `Tag1`, `Tag2`, `VisueelNr`, `Bouwjaar`, `kwaliteit`, `Actief`) VALUES
(1, 1, '0086-1700-0000-0000-0000-371E', '0086-1700-0000-0000-0000-3868', '0', '', 3, 0),
(2, 1, '0086-1700-0000-0000-0000-413F', '0086-1700-0000-0000-0000-409A', '0', '', 0, 1);
还有tableB (Instellingen)
CREATE TABLE IF NOT EXISTS `Instellingen` (
`idInstellingen` int(11) NOT NULL AUTO_INCREMENT,
`Instelling` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`Waarde` longtext COLLATE utf8_unicode_ci,
PRIMARY KEY (`idInstellingen`),
UNIQUE KEY `Instelling_UNIQUE` (`Instelling`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=220 ;
INSERT INTO `Instellingen` (`idInstellingen`, `Instelling`, `Waarde`) VALUES
(200, 'kistKwaliteit', 'a:4:{i:0;s:4:"Goed";i:1;s:5:"Matig";i:2;s:6:"Slecht";i:3;s:12:"Afgeschreven";}');
序列化的值存储在Waarde列中
【问题讨论】:
-
您有一个表,其中一列是字符串 (VARCHAR?) 并且该字符串的示例(在一行中)是
'a:4:{i:0;s:4:"Goed";i:1;s:5:"Matig";i:2;s:6:"Slecht";i:3;s:12:"Afgeschreven";}'?然后,您想在该表中搜索该字符串中包含字符串'"Afgeschreven"'的所有行吗? -
我不太确定您要过滤的内容。您可以发布一些您尝试应用过滤器的示例数据吗?据我了解,如果您想知道哪些行有
Afgeschreven,您应该过滤Kwaliteit=3,而不使用任何LIKE子句。查看一些示例数据可能有助于阐明您要查找的内容。 -
@MatBailie 对不起,如果我不够清楚。在
tableA我有这些integers代表strings存储在serialized中tableB。我想在tableA上使用string进行过滤 -
这就是为什么我们试图说服人们将他们的数据库结构标准化而不是将 json/serialized/comma-separated 数据存储在列中的原因……您必须阅读 json,对其进行解码,然后才能工作找出您的输入代表的值,然后构建您的查询,正是因为您通过不规范化消除了使用 JOIN 的选项
-
@MarkBaker 同意。就是这样。
标签: php sql filter mariadb sql-like