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

时间:2016-03-04 15:53:45

标签: php mysql

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的LOCATE和LIKE函数,但它们在这里不起作用。有人请帮助我。

2 个答案:

答案 0 :(得分:1)

看起来你需要这个查询(x是你的regin)。请参阅sqlfiddle

上的示例
SELECT * FROM t_banner WHERE keyword LIKE 'x%' OR keyword LIKE '%|x|%';

如果关键字从所需区域开始,则第一部分'x%';如果关键字的其他部分需要区域,则为第二部分'%|x|%'

答案 1 :(得分:0)

正如我在评论中所提到的,如果您对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
;