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

Php SQL查询,比较表、字符串和整数之间的数据,php,mysql,sql,database,join,Php,Mysql,Sql,Database,Join,这更像是一个“方法”问题,我还没有找到代码。但是我对SQL和php还不熟悉,并且希望智能地解决这个问题 情况如下: 我有一个名为捐款的表,每个表在名为AREA的列中正好有一个字符串值。区域可具有九个预定值中的任意一个(东北、西北、市中心等) 我还有一张志愿者表,每个人都指定了他们愿意前往的地区,以帮助领取捐款。对于每个志愿者,我有9列,每个列都有1或0,对应于上面列出的九个区域(西北、东北、DT等) 我想运行一个查询,一系列查询或php/sql组合,在那里我可以搜索所有的积极捐款,获得他们所在的

这更像是一个“方法”问题,我还没有找到代码。但是我对SQL和php还不熟悉,并且希望智能地解决这个问题

情况如下:

我有一个名为捐款的表,每个表在名为AREA的列中正好有一个字符串值。区域可具有九个预定值中的任意一个(东北、西北、市中心等)

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

我想运行一个查询,一系列查询或php/sql组合,在那里我可以搜索所有的积极捐款,获得他们所在的地区,然后查询志愿者表,并返回仅那些愿意前往其中一个或多个地区的志愿者的电子邮件地址列表


感谢您的帮助。(顺便说一下,这两个表之间没有共享键值。)

我会考虑将区域设为自己的表(ID,name)。然后为表添加AreaID(ForeignKey),而不是Area string列

对于志愿者-地区协会,我会考虑制作一个名为VolunteerAreas的链接表,该表具有志愿兵结构,AEAID。 编写一些脚本以获取现有数据并将其转储为新格式应该很简单

那你就可以

获得积极捐款

SELECT * FROM Donations WHERE Active = 1
从选定区域获取电子邮件

SELECT Email FROM Volunteers v
JOIN VolunteerAreas va ON va.VolunteerID = v.ID
WHERE va.AreaID = @AreaID

我会考虑把区域设为自己的表(ID,姓名)。然后为表添加AreaID(ForeignKey),而不是Area string列

对于志愿者-地区协会,我会考虑制作一个名为VolunteerAreas的链接表,该表具有志愿兵结构,AEAID。 编写一些脚本以获取现有数据并将其转储为新格式应该很简单

那你就可以

获得积极捐款

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 [area] FROM [database] WHERE donationSelector = selectedValue
然后根据上面得到的
$area
变量,将变量
$i
设置为列名

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

我强烈建议您更改模式,使用多个表而不是两个表

下面的SQL是一个没有主键、外键、索引等的框架

首先,在前两个表中的每个表中使用代理主键(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

我强烈建议您更改模式,使用多个表而不是两个表

下面的SQL是一个没有主键、外键、索引等的框架

首先,在前两个表中的每个表中使用代理主键(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=“从存在的幼犬中选择不同的(电子邮件)(从状态为“活动”和(REGIONCODE Mod AREAPRIME=0)的捐赠中选择*”

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

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

我对捐赠使用了相同的素数,并为每个捐赠指定了相应的素数

然后我运行了这个加入查询,查看志愿者的代码是否可以被任何可用捐款平均分割


$q=“从存在的幼犬中选择不同的(电子邮件)(从状态为“活动”和(REGIONCODE Mod AREAPRIME=0)的捐赠中选择*”

嘿,汉斯,上面的lokos很好,但它不是只适用于一次捐赠吗?我需要它能够一次归还几笔捐款。在这种情况下,只需将代码放入
while($row=mysql\u fetch\u array($result))
块,然后
$area=$row['area']。然后$i现在是您正在构建的字符串,带有
$i.=((strlen($i)>0)?“其中NE=1”:“和NE=1”)嘿,汉斯,上面的lokos很好,但它不是只适用于一次捐赠吗?我需要它能够一次归还几笔捐款。在这种情况下,只需将代码放入
while($row=mysql\u fetch\u array($result))
块,然后
$area=$row['area']。然后$i现在是您正在构建的字符串,带有
$i.=((strlen($i)>0)?“其中NE=1”:“和NE=1”)