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

标签 php mysql

这个让我难住了。我正在尝试从包含公司数据的表创建报告,其中包括两列,这两列都可以有多个值。例子: 一家公司可以分为一组或多组:

Sector: Gold; Precious Metals; Diamonds;... Industry: Mining; Refining; Marketing;...

我需要按部门/行业生成按字母顺序排列的公司列表。我的第一个方法是做这样的事情:

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

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

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

为了让它更难,我需要能够按字母顺序选择一个范围,否则用户将无法管理该 View 。同样在示例中,如果我选择字母 M,则不会显示在列表中排在前面的 Gas Utilities 公司的条目。

是否可以解决。任何想法将不胜感激。

最佳答案

首先要澄清问题……因为没有人可以尝试回答。我的数据库包含有关公司业务事件的信息,需要在报告中对其进行分类。数据的一个元素是从复选框中的可能值列表中选择的。例如,一家公司可以归类为在几个不同的领域工作(比方说,例如黄金开采、黄金精炼、勘探、金属)。接下来,我需要提取按业务事件选择的所有公司的字母顺序列表(一个字母一个字母地排列)。

我尝试的解决方案有效,但仅适用于事件列表中的第一个元素。使用示例,如果我查找以字母“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...如果它是后续元素。

终于明白了。希望这对其他人有帮助。

关于php - 使用 PHP/MySQL,如何从具有多值列内容的表中进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29254908/

相关文章:

php - 从 mysql 数据库删除行时出错

java - 公钥处理 Java/PHP

php - 使用PHP socket_write发送空格

php - 打印出包含多个数组的 JSON

php - 使用 PHP cURL 登录到远程站点

php - 如何使用来自 mysql 的 ref 数据循环 php?

mysql - iMac 上的 XAMPP - 它会对内置的 Apache、Perl、PHP 产生不利影响吗

php - PHP 表单验证/避免注入(inject)

php - PHP 中的 mySQL 查询只需要 7 列

php - 使用 MySQL 数据库进行 URL 重写