我有一个只有几列的小表,其中一个是将类别的信息存储为INT(只是一个简单的数字),例如。
id | name | category
11 | one file | 1
15 | some other file | 2
当在网站上显示数据时,我只需使用存储在PHP数组中的值转换类别的数字:
$swm_array = array(
'1' => 'Electrical',
'2' => 'HVAC',
'3' => 'Plumbing',
);
使用LIKE运算符搜索表时,如果输入数字,我可以轻松找到该类别。我需要的是实际输入类别的值,而不是键,然后根据表中的条目找到它。我一直在尝试使用完全奇怪的东西将数组包含在搜索中,但是没有vail。
在这里发现,在这些论坛中,一个导致:内部隐藏查询,但我无法将其拉出来。
如果你们能在这里帮助我,我将永远感激不尽:)
我的SQL查询:
SELECT DISTINCT
`swm_id`,
`name`,
`desc1`,
`category`,
`file`
FROM
`swims`
WHERE
(
`name` LIKE '%".$q."%'
OR `desc1` LIKE '%".$q."%'
OR `file` LIKE '%".$q."%'
OR `swm_id` LIKE '%".$q."%'
**OR `category` LIKE '%".$q."%'**
)
AND `active` = '1'
非常感谢!
此致 格雷格
答案 0 :(得分:0)
在查询之前,在php中:
$r = array_search($q, $swm_array);
然后在你的查询中:
**OR `category` = '".$r."'**
请注意,这不会充当MySQL“LIKE”,只有在您不输入完整类别时才会有效。
答案 1 :(得分:0)
implode()
进行SQL查询, IN (comma-separated-list)
将是一个很好的解决方案,但由于您使用的是LIKE,因此无效。
像这里的解决方案一样,REGEX可以工作:MySQL LIKE IN()?
但是你已经在数组中拥有了你需要的东西;也可以循环遍历它并创建你的查询:
$sqlLikes = " 1=1 ";
foreach($swm_array as $swm) {
$sqlLikes .= " OR `name` LIKE '%".$swm."%'
OR `desc1` LIKE '%".$swm."%'
OR `file` LIKE '%".$swm."%'
" ;
}
这会给你$ sqlLikes这样的:https://eval.in/119441
string(338) " 1=1 OR `name` LIKE '%Electrical%'
OR `desc1` LIKE '%Electrical%'
OR `file` LIKE '%Electrical%'
OR `name` LIKE '%HVAC%'
OR `desc1` LIKE '%HVAC%'
OR `file` LIKE '%HVAC%'
OR `name` LIKE '%Plumbing%'
OR `desc1` LIKE '%Plumbing%'
OR `file` LIKE '%Plumbing%'
"
然后你可以:
SELECT DISTINCT
`swm_id`,
`name`,
`desc1`,
`category`,
`file`
FROM
`swims`
WHERE
(
$sqlLikes
)
AND `active` = '1'
答案 2 :(得分:0)
我也需要搜索类别,并且类别存储在 DB作为数字。因此,我需要翻译搜索字符串 例如,一个数字。电气成1,暖通空调成2,水暖成3等。
建议的方法是创建一个类别表,并使您在此处列出的表的category
条目成为外键。这样您就可以加入这两个表并从类别表中搜索name
属性。
除此之外,您可以创建阵列的反转贴图。拿你原来的阵列:
$swm_array = array(
'1' => 'Electrical',
'2' => 'HVAC',
'3' => 'Plumbing',
);
你可以翻转它,这样你就有了反向地图。
$swm_flipped_map = array_flip($swm_array);
这将创建:
[
'Electrical' => '1',
'HVAC' => '2',
'Plumbing' => '3',
]
这样,您可以返回与该类别关联的数字,方法与按键查找任何数组中的项目的方式相同。如:
$electrical_num = $swm_flipped_map['Electrical'];
返回'1'
。只需使用您已熟悉的WHERE
和OR
语句将其合并到您的查询中即可。