这更像是一个"方法"问题,我还没有进入代码。但是我是SQL和php的新手,并希望智能地解决这个问题。
场景如下:
我有一个名为"捐赠"的表,每个表在名为 AREA 的列中只有一个字符串值。AREA 可以具有九个预定值中的任何一个(东北、西北、市中心等)。
我还有一张志愿者表,每个志愿者都指定了他们愿意前往哪些地区,以帮助领取捐款。对于每个志愿者,我有 9 列,每列都有 1 或 0,对应于上面列出的九个区域(NW、NE、DT 等......
我想运行一个查询,一系列查询或php/sql组合,通过我可以搜索所有活跃的捐款,获得它们所在的AREA,然后查询志愿者表,并仅为那些愿意前往一个或多个地区的志愿者返回电子邮件地址列表。
任何帮助,不胜感激。(顺便说一句,这两个表之间没有共享键值。
我会考虑将区域作为自己的表(ID,名称)。 然后,对于"捐赠"表,添加"区域 ID(外键)"而不是"区域字符串"列。
对于志愿者 - 地区协会,我会考虑制作一个名为志愿者区域的链接表,其结构为志愿者ID,AreaID。
编写一些脚本来获取现有数据并将其转储为新格式应该很简单。
然后你可以做...
获得积极捐款
SELECT * FROM Donations WHERE Active = 1
从选定区域获取电子邮件
SELECT Email FROM Volunteers v
JOIN VolunteerAreas va ON va.VolunteerID = v.ID
WHERE va.AreaID = @AreaID
您的第一个查询将如下所示
SELECT [area] FROM [database] WHERE donationSelector = selectedValue
然后根据您从上面获得的$area
变量将变量$i
设置为列名
<?php
switch($area) {
case "Northwest" :
$i = "NW";
break;
case "Northeast" :
$i = "NE";
break;
...etc.
}
然后执行另一个查询
SELECT * FROM [database] WHERE %s = 1, $i
我强烈建议更改您的架构,使用多个表而不是两个表。
下面的 SQL 是一个没有主键、外键、索引等的框架。
CREATE TABLE area (
id INT NOT NULL AUTOINCREMENT,
name VARCHAR(128)
)
CREATE TABLE volunteer (
id INT NOT NULL AUTOINCREMENT,
name VARCHAR(128)
)
CREATE TABLE coverage (
area_id INT,
volunteer_id INT
)
首先,在前两个表中的每一个表中使用代理项主键(id 列)意味着您可以更改实体的名称而不会破坏任何内容。
其次,添加新区域时,只需向每个表添加新记录,而无需向志愿者表添加新的二进制标志字段。
第三,查询变得更整洁、更易于维护、更快......
SELECT
volunteer.*
FROM
area
INNER JOIN
coverage
ON area.id = coverage.area_id
INNER JOIN
volunteer
ON volunteer.id = coverage.volunteer_id
WHERE
area.name IN ('NW', 'SE')
GROUP BY
volunteer.id
因此,我通过完全不同的方法解决了这个问题,尽管我确信上述方法会起作用。
我创建了为每个区域分配一个质数,从 2、3、5 等开始......然后,当志愿者注册时,它会通过乘以他们愿意去的区域来为他们创建一个代码。
我使用相同的素数进行捐赠,并为每次捐赠分配适当的素数。
然后我运行了这个连接查询,看看志愿者的代码是否被任何可用的捐赠平均划分。
$q ="从存在的地方选择区别(电子邮件)(从状态='活动'和(区域代码Mod AREAPRIME = 0)的捐赠中选择*)";