我试图允许用户使用最多 4 个不同的参数显示progs
数据库中匹配的行数。
棘手的一点是参数可能是 6 个字段之一。
我正在寻找其中任何一行的genre_id
- genre_id1
,genre_id2
,genre_id3
,genre_id4
,genre_id5
或genre_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_id1
、genre_id2
、genre_id3
、genre_id4
、genre_id5
或genre_id6
上的事件。
我想获得一些结果并显示结果行。
我无法弄清楚我该如何做到这一点。
数据库规范化
你需要问自己的是,为什么要以这种方式构建数据库。
每行只有一个genre_id会更明智。这样,您只需计算与特定ID匹配的行数。为什么你的行中有 6 个genre_ids?
如果你确实需要每个"prog"6个,那么只需创建一个新的表,称为"流派"并将其链接到你的"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"也可以只有 3 种流派或 9 种流派。这比一行中只有 6 个类似的字段要灵活得多。
请参阅:http://databases.about.com/od/specificproducts/a/normalization.htm
你有几个选择
使用"反向"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
如果您需要每个字段计数,则需要以下内容:
SELECT SUM(genre_id1 = $genre_id) AS id1_matches,
SUM(genre_id2 = $genre_id) AS id2_matches
etc...
其中MySQL将获取id = $id
测试的布尔真/假,将其转换为整数0
和1
,然后对1
求和。
一种选择是编写一个使用 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 来计算您拥有匹配项的次数。这可以在循环中简化,但我没有足够的技能来简化它。