是 LIKE,但 int 表示应检查的字符串
is LIKE, but with int representing an string on which should be checked
假设我有一个 table (tableA
),其中有一列 Kwaliteit
,它将包含一个 int
值 (0, 1, 2, 3
)代表一些字符串值。
这些字符串值被序列化存储在另一个 table (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
你不能。您应该按数组键(又名 3 或 2)进行搜索,这也会加快查询速度。
对于更新的结构,您可以尝试使用:
select * from Instellingen where Waarde like "%Afgeschreven%";
你所拥有的大概是这样的:
select * from tablea where kwaliteit = 'Afgeschreven';
这不起作用,因为 kwaliteit 是代码,而不是字符串。你要找的是关于这个的:
select * from tablea where kwaliteit =
(select kwaliteit from tableb where text = 'Afgeschreven');
由于您保存了序列化为文本的 kwaliteit 值的整数到字符串的映射,因此无法 select 基于 MySQL 中的 text/label。
例如,您可以做的是创建一个新的 table Kwaliteit,其中包含 2 列,id 和 label。然后你可以加入那个新的 table 和 Kist table ON Kist.kwaliteit = Kwaliteit.id
where 条件将与那些列名 WHERE label = 'Afgeschreven'
另一种可能性是更改 Instellingen table:将 Waarde 列拆分为 2、id 和 value。这意味着 table 中的 4 行用于 table:
中的 kwaliteit
(200, 'kistKwaliteit', '0', 'Goed'),
(200, 'kistKwaliteit', '1', 'Matig'),
(200, 'kistKwaliteit', '2', 'Slecht'),
(200, 'kistKwaliteit', '3', 'Afgeschreven')
请求可以是
SELECT * FROM Kist WHERE kwaliteit =
(SELECT id FROM Instellingen WHERE Instelling = 'kistKwaliteit' AND value = 'Afgeschreven')
如果要保持数据库结构不变,则必须在 PHP 端处理获取与所需质量相匹配的 ID。例如,如果它是用户可以通过下拉列表选择的内容,则将值作为保存在序列化数组中的 ID,并将标签用作标签。或者在传递质量字符串时,首先从数据库中获取序列化数组以查找 ID,然后在 SELECT.
中使用该 ID
假设我有一个 table (tableA
),其中有一列 Kwaliteit
,它将包含一个 int
值 (0, 1, 2, 3
)代表一些字符串值。
这些字符串值被序列化存储在另一个 table (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
你不能。您应该按数组键(又名 3 或 2)进行搜索,这也会加快查询速度。
对于更新的结构,您可以尝试使用:
select * from Instellingen where Waarde like "%Afgeschreven%";
你所拥有的大概是这样的:
select * from tablea where kwaliteit = 'Afgeschreven';
这不起作用,因为 kwaliteit 是代码,而不是字符串。你要找的是关于这个的:
select * from tablea where kwaliteit =
(select kwaliteit from tableb where text = 'Afgeschreven');
由于您保存了序列化为文本的 kwaliteit 值的整数到字符串的映射,因此无法 select 基于 MySQL 中的 text/label。
例如,您可以做的是创建一个新的 table Kwaliteit,其中包含 2 列,id 和 label。然后你可以加入那个新的 table 和 Kist table ON Kist.kwaliteit = Kwaliteit.id where 条件将与那些列名 WHERE label = 'Afgeschreven'
另一种可能性是更改 Instellingen table:将 Waarde 列拆分为 2、id 和 value。这意味着 table 中的 4 行用于 table:
中的 kwaliteit(200, 'kistKwaliteit', '0', 'Goed'),
(200, 'kistKwaliteit', '1', 'Matig'),
(200, 'kistKwaliteit', '2', 'Slecht'),
(200, 'kistKwaliteit', '3', 'Afgeschreven')
请求可以是
SELECT * FROM Kist WHERE kwaliteit =
(SELECT id FROM Instellingen WHERE Instelling = 'kistKwaliteit' AND value = 'Afgeschreven')
如果要保持数据库结构不变,则必须在 PHP 端处理获取与所需质量相匹配的 ID。例如,如果它是用户可以通过下拉列表选择的内容,则将值作为保存在序列化数组中的 ID,并将标签用作标签。或者在传递质量字符串时,首先从数据库中获取序列化数组以查找 ID,然后在 SELECT.
中使用该 ID