是 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