1

这更像是一个“方法”问题,我还没有拿到代码。但我是 SQL 和 php 的新手,想聪明地解决这个问题。

场景如下:

我有一个名为 Donations 的表,每个表在名为 AREA 的列中都有一个字符串值。AREA 可以具有九个预定值(东北、西北、市中心等)中的任何一个。

我还有一张志愿者表,每个人都指定了他们愿意前往的地区,以帮助领取捐款。对于每个志愿者,我有 9 列,每列都有 1 或 0,对应于上面列出的九个区域(NW、NE、DT 等...)

我想运行一个查询、一系列查询或 php/sql 组合,我可以在其中搜索所有活跃的捐赠,获得它们所在的区域,然后查询志愿者表,并获取仅那些的电子邮件地址列表愿意前往其中一个或多个地区的志愿者。

任何帮助表示赞赏。(顺便说一句,这两个表之间没有共享键值。)

4

4 回答 4

1

我会考虑让 Areas 成为它自己的表(ID、Name)。然后为 Donations 表添加 AreaID (ForeignKey) 而不是 Area 字符串列。

对于志愿者 - 区域协会,我会考虑制作一个名为 VolunteerAreas 的链接表,其结构为 VolunteerID,AreaID。

编写一些脚本来获取现有数据并将其转储为新格式应该很简单。

那你可以做...

获得积极捐款

SELECT * FROM Donations WHERE Active = 1

从选定区域获取电子邮件

SELECT Email FROM Volunteers v
JOIN VolunteerAreas va ON va.VolunteerID = v.ID
WHERE va.AreaID = @AreaID
于 2012-06-06T18:24:02.200 回答
0

你的第一个查询看起来像

SELECT [area] FROM [database] WHERE donationSelector = selectedValue

然后根据你从上面得到的变量$i为列名设置一个变量$area

<?php
switch($area) {
    case "Northwest" :
        $i = "NW";
        break;
    case "Northeast" :
        $i = "NE";
        break;
    ...etc.
}

然后做另一个查询

SELECT * FROM [database] WHERE %s = 1, $i
于 2012-06-06T18:25:14.933 回答
0

所以,我完全通过一种完全不同的方法解决了这个问题,尽管我确信上述方法会奏效。

我为每个区域分配了一个素数,从 2、3、5 等开始……然后当志愿者注册时,它通过乘以他们愿意去的区域为他们创建一个代码。

我对捐赠使用了相同的质数,并为每笔捐赠分配了适当的质数。

然后我运行了这个连接查询,看看志愿者的代码是否可以被任何可用的捐款整除。

$q = "从存在的 PUPS 中选择 Distinct(EMAIL)(从 STATUS = 'ACTIVE' AND (REGIONCODE Mod AREAPRIME = 0) 的捐赠中选择 *)";

于 2012-06-21T22:22:53.840 回答
0

我强烈建议您更改架构,使用多个表而不是两个。

下面的 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
于 2012-06-06T18:28:10.113 回答