SQL查询,比较表,字符串和整数之间的数据

时间:2012-06-06 18:15:56

标签: php mysql sql database join

这更像是一个“方法”问题,我还没有得到代码。但我是SQL和PHP的新手,并希望能够智能地解决这个问题。

方案如下:

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

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

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

感谢任何帮助。 (另外,这两个表之间没有共享密钥值。)

4 个答案:

答案 0 :(得分:1)

我会考虑将Areas设为自己的表(ID,Name)。然后,对于Donations表,您可以添加AreaID(ForeignKey)而不是Area string列。

对于志愿者 - 地区协会,我会考虑制作一个名为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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

我使用相同的素数进行捐赠,并为每次捐赠分配适当的素数。

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

$ q =“从PUPS中选择Distinct(EMAIL),其中EXISTS(从捐赠中选择*,其中STATUS ='ACTIVE'AND(REGIONCODE Mod AREAPRIME = 0))”;