多次搜索六个字段

时间:2014-12-15 20:38:29

标签: php mysql

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

棘手的一点是参数可能是6个字段之一。

我正在其中任一行上寻找genre_id - genre_id1genre_id2genre_id3genre_id4genre_id5genre_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; }

上面的代码用于显示一个genre_id的匹配项数。但是我想要寻找另外3种类型的id。所以我想展示所有4个提交的流派ID出现在genre_id1genre_id2genre_id3genre_id4genre_id5或{{1}的事件}。

我想获得一些结果并显示结果行。

我无法理解如何做到这一点。任何帮助表示赞赏。

圣诞节快乐!

尼克

3 个答案:

答案 0 :(得分:1)

数据库规范化

您需要问自己的是为什么要按照您的方式构建数据库。

每行只有一个genre_id会更加明智。这样你就可以计算出与某个id相匹配的行数。为什么你的行中有6个genre_ids?

如果你确实需要6个''prog',那么只需创建一个名为“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>
)

此处prog_id引用progs表。现在,第二个更简单的表更容易进行查询。现在每个'prog'或9只有3种类型。这更灵活,一行中只有6个相似的字段。

请参阅:http://databases.about.com/od/specificproducts/a/normalization.htm

答案 1 :(得分:0)

你有几个选择

使用&#34;反向&#34; IN

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

如果您需要PER-FIELD计数,那么您需要以下内容:

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

其中mysql将采用id = $id测试的布尔值true / false,将其转换为整数01,然后总结1&#39 ; S

答案 2 :(得分:0)

一种选择是编写一个使用IN运算符的查询,并检查genre_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来计算匹配的次数。这可能会在循环中简化,但我不够熟练,无法简化。