数据库查询中的爆炸或拆分值(PHP / MySQL)

时间:2014-05-25 15:22:27

标签: php mysql

我的数据库表中的一个字段(符号)显示如下所示的URL:

arizona/flag
arizona/flower
arizona/flower2
arizona/bird

另一个数据库表(文章)包含内容,如下所示:

+----------+-----------------+-------------+
| State-ID | PostURL         |     Article |
+----------+-----------------+-------------+
| us-az    | flag            | (text)      |
| us-az    | flower          | (text)      |
| us-az    | flower2         | (text)      |
| us-az    | bird            | (text)      |
| us-fl    | flag            | (text)      |
+----------+-----------------+-------------+

所以我的数据库查询必须连接这两个表。我只是在第一个表(符号)PostURL中添加了一个新字段,其值为flag,flower,flower2等。

它有效,但它有点多余,我想简化我的表格。所以我意识到我可以简单地将这些表连接到Symbols.URL中每个值的第二段。

我当前的join子句看起来像这样:

LEFT JOIN articles ART ON ART.ID = Sym.IDArea AND ART.PostURL = Sym.DesigGen

我想将其更改为:

LEFT JOIN gs_articles_world_usa ART ON ART.ID = GS.IDArea AND ART.PostURL = [2nd segment in value from field Sym.URL]

因此,URL的佛罗里达/花和佛罗里达/花2的第二段的值将是 flower2

我知道如何在查询中提取值后使用Explode来隔离这些值。但有没有办法在初始查询中隔离这些值?换句话说,我可以在查询本身内使用Explode或其他一些函数吗?

2 个答案:

答案 0 :(得分:1)

您可以使用LOCATE查找斜杠的位置,并使用SUBSTR在斜杠的位置后剪切字符串。

SUBSTR(Sym.URL, LOCATE('/', Sym.URL) + 1)

请注意LOCATE将获取您要查找的第一个字符串的位置。上面的代码只有在Sym.URL中总是有1个斜杠时才有效。

答案 1 :(得分:1)

在MySQL中没有本地方法可以做到这一点,但显然as this blog describes你可以创建自己的SPLIT_STR函数。

首先,DB用户必须具有INSERT权限才能创建该功能。接下来,通过将其作为查询运行来创建该函数:

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

完成后,您可以访问&使用以下语法的函数:

SELECT SPLIT_STR(string, delimiter, position);

所以使用你的例子 - 并且没有看到更大的MySQL查询 - 也许这样的事情会起作用:

SELECT SPLIT_STR(Sym.URL, '/', 2) as Split_Sym_URL from [table name];

Split_Sym_URL的命名只是我的选择。随意将其更改为适合您的其他任何内容。 [table name]应该是您的表名。

然后您可以在Split_Sym_URL中使用JOIN,如下所示:

LEFT JOIN gs_articles_world_usa ART ON ART.ID = GS.IDArea AND ART.PostURL = Split_Sym_URL