这件事一直困扰着我,我想不通了。我将使用食品类比来尝试简化我的问题。
1000名公众被要求从13种步法中的每一种中挑选一种。然后,这些选择被存储在mysql数据库中,与它们的名称相对应。
e.g. billy mary etc. etc.
milk....semi. .skimmed...
bread...white...brown....
cheese..edam.....edam....
fruit...apple...orange...
veg....potato...sprout...
meat....beef.....beef....
sweet..bonbons..liquorice..
fish...trout....salmon...
crisp....s&v....plain....
biscuit..hovis..rich tea..
wine.....red.....red.....
beer....stella..carlsburg..
carb....coke.....pepsi....然后,这1000人中的一人被要求通过复选框选择0到13个选项中的任何一个。
通过搜索数据库,有多少人选择了相同的品种?
在表格中显示它们的所有名称以及它们为所有13个品种选择的内容。
这有意义吗?我希望如此因为这让我抓狂。
发布于 2008-10-22 22:39:00
假设你有一个简单的布局,那么你应该有类似这样的东西(我将我自己限制在其中的三个类别):
PersonId What_Milk What_Bread What_Cheese
1 Semi Wheat Swiss
2 Skimmed Rolls French
3 Soy Brown Smelly
4 Low Fat Wheat Swiss如果我没理解错的话,你的问题是:
当要求人员4选择0时..3的食物,她可以选择"Bread“和"Cheese”复选框,这意味着查询应该将person 1作为匹配项。对吗?
SELECT
PersonId,
What_Milk,
What_Bread,
What_Cheese
FROM
FoodPreference
WHERE
PersonId != ?
AND What_Milk = IFNULL(NULLIF(?, ''), What_Milk)
AND What_Bread = IFNULL(NULLIF(?, ''), What_Bread)
AND What_Cheese = IFNULL(NULLIF(?, ''), What_Cheese)您的复选框值稍后将位于问号占位符所在的位置。(我已经用IFNULL/NULLIF替换了以前在这里的构造,它具有相同的效果,但对于PHP准备好的语句更友好。)
如果复选框未被选中(因此将值固定为某个值),则将相应的列与其自身进行比较。这意味着它的值不会影响结果。如果其他列匹配,则该行将被选中。
这也意味着,如果用户选择了零个复选框,则将返回所有行。一个人选择的食物越多,匹配的结果就越接近。
在PHP语言中,我建议您使用mysqli_prepare()从查询字符串创建准备好的语句,使用mysqli_stmt_bind_param()将实际值绑定到问号占位符。这比直接构建SQL字符串要安全得多。PHP documentation has a whole lot of info on mysqli,看看吧。
发布于 2008-10-22 22:34:07
部分答案:
排序和concatenating
所以你首先要做一个计算运行,把字符串放到某个字段中,比如字面上的“牛奶|半|脱脂”。
发布于 2008-10-22 23:09:39
SELECT
PersonId,
milk,
bread,
cheese
FROM FoodPreference
WHERE PersonId != :chosen_person_id
AND $milk= CASE WHEN :isset($_POST["milk"]))> '' THEN :isset($_POST["milk"])) ELSE milk END
AND $bread= CASE WHEN :isset($_POST["bread"]))> '' THEN :isset($_POST["bread"])) ELSE bread END
AND $cheese= CASE WHEN :isset($_POST["cheese"]))> '' THEN :isset($_POST["cheese"])) ELSE cheese END我在正确的轨道上吗?
https://stackoverflow.com/questions/227596
复制相似问题