MySQL 查询,从数据库表中的所有字符串中找出特定区域数据,并列出所有相关横幅


MySQL query to find out specific region data from all strings in database table and list all related banners

tr_regions 表包含美国各州的区域详细信息。

INSERT INTO tr_regions`(`regionpkid`,`regionname`,`statepkid`,`statename`) VALUES
(1, 'Alabama Gulf Coast', 13, 'Alabama'),
(2, 'Greater Birmingham', 13, 'Alabama'),
(3, 'Black Belt', 13, 'Alabama'),
(4, 'Central Alabama', 13, 'Alabama'),
(5, 'Lower Alabama', 13, 'Alabama'),
(6, 'Mobile Bay', 13, 'Alabama'),
(7, 'North Alabama', 13, 'Alabama'),
(8, 'Northeast Alabama', 13, 'Alabama'),
(9, 'Northwest Alabama', 13, 'Alabama'),
(10, 'South Alabama', 13, 'Alabama');

t_banner表中,每个横幅都有特定的区域关键字。它将帮助我在网站上的特定区域页面上向访问者显示横幅。(例如:当访问者访问#8,#9和#10区域页面时,将显示横幅1)。

INSERT INTO `t_banner` (`bannerpkid`, `keyword`) VALUES
(1,'8|Northeast Alabama|9|Northwest Alabama|10|South Alabama|'),
(2,'2|Greater Birmingham|4|Central Alabama|6|Mobile Bay|'),
(3,'5|Lower Alabama|7|North Alabama|9|Northwest Alabama|'),
(4,'3|Black Belt|6|Mobile Bay|9|Northwest Alabama|'),
(5,'1|Alabama Gulf Coast|2|Greater Birmingham|3|Black Belt|'),
(6,'5|Lower Alabama|8|Northeast Alabama|10|South Alabama|');

现在在我的控制面板中,我有列出所有这些区域的菜单。现在我希望每当我选择任何区域时,都应该显示在其关键字字段中选择区域的所有横幅。

$int_region_pkid=0;
if(isset($_GET["regionpkid"]))
{
    $int_region_pkid=trim($_GET["regionpkid"]);
}
$str_query_select="SELECT * FROM t_banner WHERE ... ";

如何编写上述查询以获得所需的结果?我尝试了MySQL的定位和喜欢功能,但它们在这里不起作用。有人请帮助我。

看起来你需要这个查询(x是你的注册)。参见 sqlfiddle 中的示例

SELECT * FROM t_banner WHERE keyword LIKE 'x%' OR keyword LIKE '%|x|%';

第一部分'x%'关键字是否从所需区域开始,第二部分'%|x|%'关键字的其他部分中是否从所需区域开始

正如我的评论中所述,如果您对t_banner有任何控制权,那么将其转换为包含区域外键的链接表是有意义的。您可以像这样创建表:

CREATE TABLE `t_banner` (
`bannerpkid` integer,
`regionfkid` integer
);

然后,您可以使用如下所示的内容填充横幅和区域键:

INSERT INTO `t_banner` (`bannerpkid`, `regionfkid`) VALUES
(1, 8),
(1, 9),
(1, 10),
(2, 2),
(2, 4),
(2, 6),
(3, 5),
(3, 7),
(3, 9),
(4, 3), 
(4, 6),
(4, 9),
(5, 1),
(5, 2),
(5, 3),
(6, 5),
(6, 8),
(6, 10)
;

从那里,您可以编写这样的查询,该查询将为您提供给定区域的所有横幅:

SELECT DISTINCT
    bannerpkid
FROM
    t_banner tb
      JOIN
    tr_regions tr on tr.regionpkid = tb.regionfkid
WHERE
    regionname = 'Northwest Alabama'
ORDER BY
    bannerpkid
;