Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多次搜索六个字段_Php_Mysql - Fatal编程技术网

Php 多次搜索六个字段

Php 多次搜索六个字段,php,mysql,Php,Mysql,我试图允许用户使用最多4个不同的参数显示progs数据库中匹配行的数量 棘手的是,参数可能是6个字段中的一个 我在以下行中寻找类型id,类型id1,类型id2,类型id3,类型id4,类型id5或类型id6 因此,为了找到一个流派id的正确匹配数,我使用以下代码: $total=0; for ($i = 1; $i < 7; $i++) { $howmany = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM `progs` WH

我试图允许用户使用最多4个不同的参数显示
progs
数据库中匹配行的数量

棘手的是,参数可能是6个字段中的一个

我在以下行中寻找
类型id
类型id1
类型id2
类型id3
类型id4
类型id5
类型id6

因此,为了找到一个流派id的正确匹配数,我使用以下代码:

$total=0;
for ($i = 1; $i < 7; $i++) {
$howmany = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM `progs` WHERE `genre_id$i`  
='$genre_id'"),0);
$total=$total+$howmany; }
$total=0;
对于($i=1;$i<7;$i++){
$howmany=mysql\u结果(mysql\u查询(“选择COUNT(*)作为`progs`中的Num,其中`genre\u id$i`)
=“$quare_id”,0);
$total=$total+$howmount;}
上面的代码用于显示一个
类型id
的匹配数。但我想再找另外3种类型的id。因此,我想展示所有4个提交的流派ID出现在
流派id1
流派id2
流派id3
流派id4
流派id5
流派id6
上的事件

我想得到一些结果并显示结果行

我不知道该怎么做。谢谢你的帮助

圣诞快乐


尼克

你有两个选择

在中使用“反转”

WHERE $genre_id IN (genre_id1, genre_id2, .... genre_id6)
或者把它们全部写出来:

WHERE genre_id1 = $genre_id OR genre_id2 = $genre_id OR .... $genre_id = genre_id6
如果需要每个字段的计数,则需要以下内容:

SELECT SUM(genre_id1 = $genre_id) AS id1_matches,
    SUM(genre_id2 = $genre_id) AS id2_matches 
    etc...

其中mysql将采用
id=$id
测试的布尔值true/false,将其转换为整数
0
1
,然后将
1
相加。

一个选项是编写一个使用
IN
操作符的查询,并检查类型id是否在您想要的列表中,如下所示:

SELECT SUM(
    (CASE WHEN genre_id1 IN (four_genre_ids) THEN 1 ELSE 0 END) +
    (CASE WHEN genre_id2 IN (four_genre_ids) THEN 1 ELSE 0 END) +
    (CASE WHEN genre_id3 IN (four_genre_ids) THEN 1 ELSE 0 END) +
    (CASE WHEN genre_id4 IN (four_genre_ids) THEN 1 ELSE 0 END) +
    (CASE WHEN genre_id5 IN (four_genre_ids) THEN 1 ELSE 0 END) +
    (CASE WHEN genre_id6 IN (four_genre_ids) THEN 1 ELSE 0 END)) AS totalMatches
FROM myTable;
因此,对于每一行,这将通过在每次找到匹配项时添加1来计算您拥有匹配项的次数。这可能可以在循环中简化,但我没有足够的技能来简化它。

数据库规范化 你需要问自己的是,为什么要用这种方式构建数据库

每行只有一个流派id更为明智。这样,您可以只计算与某个id匹配的行数。为什么您的行中有6个类型id

如果您确实需要每个“prog”6个,那么只需创建一个名为“genres”的新表,并将其链接到您的“progs”表。像这样:

CREATE TABLE `progs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  <any other fields>
)

CREATE TABLE `genres` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `prog_id` int(11)
  <any other fields>
)
创建表'progs`(
`id`int(11)非空自动增量,

谢谢你的评论。我想你可能是对的。我继承了数据库,我认为你的建议是最好的解决方案。我不知道反向输入法。知道非常有帮助。感谢你的评论。我认为最好的解决方案是整理我的数据库,但这种输入法是我将来可以使用的。对我知道,谢谢。