繁体   English   中英

使用PHP / MySQL,如何从具有多值列内容的表中进行选择

[英]Using PHP/MySQL, how can I SELECT from table with multi-value column content

这个让我难过。 我正在尝试从具有公司数据的表中创建报告,该数据包括两个列,两个列都可以具有多个值。 示例:公司可以归为一个或多个组:

行业:黄金; 贵金属; 钻石; ...行业:采矿; 精制; 市场营销; ...

我需要按行业/行业列出按字母顺序排列的公司。 我的第一种方法是执行以下操作:

$request = "SELECT sector, industry, name, uid FROM colist ORDER BY LOWER(industry),LOWER(sector) ASC"  ;

但这给了我只按多个元素中的第一个排序的结果。 因此,行业的结构化级联视图在顶层看起来像这样: 视图

在此示例中,它不会将具有多个值的行分解为(天然气公用事业/中游-石油和天然气)和(金矿开采/金银矿)和(通用制药/特种制药)的单独条目。

为了使它更加困难,我需要能够按字母顺序选择一个范围,否则该视图对于用户来说是难以管理的。 再次在示例中,如果我选择字母M,则不会显示燃气公用事业公司名列前茅的公司条目。

有可能解决。 任何想法将不胜感激。

首先要澄清这个问题,因为没人能回答。 我的数据库包含有关公司业务活动的信息,需要在报告中对其进行分类。 从复选框的可能值列表中选择数据元素之一。 例如,可以将一家公司归类为在几个不同领域中工作(例如,金矿开采,金精炼,勘探,金属)。 接下来,我需要按业务活动选择所有公司的字母列表(一个字母一个字母)。

我尝试的解决方案有效,但仅适用于活动列表中的第一个元素。 在该示例中,如果我查找以字母“ G”开头的活动,它将返回公司,因为该列的确以字母“ G”开头,但是如果我查找字母“ E”,它将找不到该公司,因为即使公司确实将其归类为“探索”,该列也不以字母“ E”开头。

答案是……一行中的一列可以用作存储多个值的数组,但是只有创建和读取它的程序员代码才知道这一点。 SQL无法理解数组-对于SQL,行/列的内容只是一个字符串。 使用上面的示例,尽管我将数据视为数组中单独元素的列表,如下所示:

Gold Mining
Gold Refining
Exploration
Metals

对SQL来说,看起来就像是Gold Mining,Gold Refining,Exploration,Metals ,因此无法直接应用任何逻辑。

但是,只要注意使用正确的分隔符(逗号是一个非常糟糕的选择),那么即使SQL不知道,您也可以使用一些SQL代码来查找数组中的所有元素。

通过将特殊字符%与LIKE一起使用,可以匹配将元素分开的已知模式。 举一个更好的例子,如果您创建一个更专业的分隔符,最好是一个永远不会在文本内部使用的分隔符,那么一切都会奏效。 拿我的旧列表,并添加一个更具体的分隔符,您将获得类似于Gold Mining~Gold Refining~Exploration~Metals文本。 在我自己的代码中,我可以从中创建一个数组,并以自己想要的任何方式处理它,就像这样……

$chosen = explode("~" , $row['industry']) ;foreach ($chosen as $choice){...do something};

现在要分别选择字符串中的每个元素,您需要告诉SQL查找作为分隔符的内容,像这样...

$request = "SELECT sector, industry, company_id, name, stat FROM companies WHERE isopen <> '' AND ( industry LIKE '". $sk . "%' OR industry LIKE '%;". $sk . "%' ORDER BY LOWER(industry),LOWER(sector) ASC"  ;}

代码中的$ sk是用户可以从字母中选择的一个字母,表示该行业的起始字母是什么。

必要的部分是告诉SQL查找包含分隔符的模式。 以查找字母“ E”的示例为例,它可以采用两种形式,即E ....(如果它是“数组”中的第一个元素)或...〜E ...(如果它是后继元素)。

最后,明白了。 希望这对其他人有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM