(抱歉,如果这是重复的 - 我已经尝试过搜索,但我可能不知道我想要达到的目标的正确词 - 请随时纠正我!)
的背景
所以我有一个基于 PHP 的应用程序(Codeigniter,但我在这部分使用普通的 SQL 语言),它有一个 MySQL 数据库,有 2 个表 - 'contact' 和 'order'。
为简单起见,我们假设:
- 'contact' 有 3 个列:Id、FirstName、LastName
- “订单”有 4 个列:Id、ContactId、ItemBought、ItemValidDate
- “订单”表中的一行示例:22、11、成人会员资格、2012/13
- Id 是两个表的主键,ContactId 是“联系人”的外键,ItemBought 和 ItemValidDate 都是简单的 varchar(我们存储的是“季节”而不是日期——我知道,它并不理想,但它是客户想要的)
在某些时候,我知道,我将不得不将其扩展为 3 个表并使用 OrderItem 表,以允许一个订单有多个项目,所以我想找到一个可以构建的解决方案。但目前,我什至不了解基础知识,所以我将其保留在 2 张桌子上
问题
我想创建一个搜索页面,允许用户根据许多不同的条件查找记录子集。
此表单作为一组标准提交,如下所示:
[order_type_operator] => Array
(
[0] => equal
[1] => equalor
[2] => notequal
)
[order_type] => Array
(
[0] => Adult Membership
[1] => Adult Membership
[2] => Adult Membership
)
[order_expire] => Array
(
[0] => 2005/06
[1] => 2006/07
[2] => 2010/11
)
[submit] => Start Search
然后我循环遍历这个数组,测试是否已经提交了值,并构建了我的 SQL 查询。
所以,我希望我已经正确解释了它,以便清楚用户可以使用此表单来搜索匹配许多不同条件的记录 - 理论上,无限数量的条件 -最终得到一个匹配的联系人列表这个标准。
我试过的
示例 1 - 简单的 WHERE
- "查找在 '2009/10' 中具有 'Adult Membership' 订单记录的联系人记录"
- IE
SELECT * FROM contact JOIN order ON contact.Id = order.ContactId WHERE (order.ItemBought = 'Adult Membership' AND order.ItemValidDate = '2009/10')
这工作正常。
示例 2 - WHERE 或 WHERE
- “查找在 '2009/10' 中具有 'Adult Membership' 订单记录的联系人记录”或在 '2010/10' 中具有 'Adult Membership' 订单记录
- IE
SELECT * FROM contact JOIN order ON contact.Id = order.ContactId WHERE (order.ItemBought = 'Adult Membership' AND order.ItemValidDate = '2009/10') OR (order.ItemBought = 'Adult Membership' AND order.ItemValidDate = '2010/11')
只要用户要求的每个条件都是 OR 查询,这就可以正常工作。我假设我可以使用方括号和 OR 来构建这个查询,只要我喜欢就可以?例如,在 2005/06、OR 2006/07、OR 2007/08、OR 2008/09 等中查找成人会员资格会像上面的 SQL 一样,用“OR”连接更多的括号?
示例 3 - WHERE 和 WHERE - 我被卡住了!
- “查找在 '2009/10' 或 2010/11 年具有 'Adult Membership' 订单记录并且在 '2012/13' 中具有'Adult Membership' 订单记录的联系人记录
目前,我一直在尝试 UNION,但是如果有更多查询要遵循这个(例如 2008 年或 2009 年和 2010 年的成人会员资格),这意味着要执行多个 SELECT。(也许这就是答案?)
例如`SELECT * FROM contact JOIN order ON contact.Id = order.ContactId WHERE (order.ItemBought = 'Adult Membership' AND order.ItemValidDate = '2009/10') OR (order.ItemBought = 'Adult Membership' AND order. ItemValidDate = '2010/11')
UNION
SELECT * FROM contact
JOIN order ON contact.Id = order.ContactId WHERE (order.ItemBought = 'Adult Membership' AND order.ItemValidDate = '2012/13)`
示例 4 - 但没有记录....让我大吃一惊
- “查找在 '2009/10' 中有 'Adult Membership' 订单记录并且在 '2010/10' 中有 'Adult Membership' 订单记录但在 2007/08 年没有'Sponsorship' 订单的联系人记录
我想知道运行这些查询,将结果存储在 PHP 数组中,然后执行 a IN (*array of ids already selected*)
,但这似乎我没有正确使用 SQL。
这么聪明的人——我做错了什么?
非常感谢您的帮助。
PS。不是要你为我写代码!
聚苯乙烯。如果您知道任何好的教程,那么我会很高兴地关注它们!
购买力平价。如果这是重复的,那么请接受我的道歉!