0

我是 SQL 新手,所以如果它很简单,请原谅我的问题。

我有一个带有几张表的数据库。1 是用户表,其他是应用程序表,其中包含用户根据他们感兴趣的国家/地区接收有关该应用程序的通知的偏好。

我想做的是检索所有对该国家感兴趣的用户的电子邮件地址。我正在努力思考如何做到这一点。我目前构建了以下查询,以及填充值的代码

function check($string)
{
    if (isset($_POST[$string])) {
        $print = implode(', ', $_POST[$string]); //Converts an array into a single string
        $imanageSQLArr = Array();


        if (substr_count($print,'Benelux') > 0) {
            $imanageSQLArr[0] = "checked";

        } else {
            $imanageSQLArr[0] = "off";


        }

        if (substr_count($print, 'France') > 0) {
            $imanageSQLArr[1] = "checked";

        } else {
            $imanageSQLArr[1] = "off";

        }
        if (substr_count($print,  'Germany') > 0) {
            $imanageSQLArr[2] = "checked";
        } else {
            $imanageSQLArr[2] = "off";

        }
        if (substr_count($print,  'Italy') > 0) {
            $imanageSQLArr[3] = "checked";
        } else {
            $imanageSQLArr[3] = "off";

        }
        if (substr_count($print, 'Netherlands') > 0) {
            $imanageSQLArr[4] = "checked";
        } else {
            $imanageSQLArr[4] = "off";

        }
        if (substr_count($print,  'Portugal') > 0) {
            $imanageSQLArr[5] = "checked";

        } else {
            $imanageSQLArr[5] = "off";
        }
        if (substr_count($print,  'Spain') > 0) {
            $imanageSQLArr[6] = "checked";

        } else {
            $imanageSQLArr[6] = "off";
        }
        if (substr_count($print,  'Sweden') > 0) {
            $imanageSQLArr[7] = "checked";

        } else {
            $imanageSQLArr[7] = "off";
        }
        if (substr_count($print,  'Switzerland') > 0) {
            $imanageSQLArr[8] = "checked";

        } else {
            $imanageSQLArr[8] = "off";
        }

        if (substr_count($print, 'UK') > 0) {
            $imanageSQLArr[9] = "checked";

        } else {
            $imanageSQLArr[9] = "off";
        }

和查询

$tocheck = $db->prepare(
    "SELECT users.email
     FROM users,app
     WHERE users.id=app.userid
     AND BENELUX=:BENELUX
     AND FRANCE=:FRANCE
     AND GERMANY=:GERMANY
     AND ITALY=:ITALY
     AND NETHERLANDS=:NETHERLANDS
     AND PORTUGAL=:PORTUGAL
     AND SPAIN=:SPAIN
     AND SWEDEN=:SWEDEN
     AND SWITZERLAND=:SWITZERLAND
     AND UK=:UK");
$tocheck->execute($country);
$row = $tocheck->fetchAll();

这确实会检索数据,但只有偏好与所放内容完全匹配的人(因此他们未选择的内容与他们拥有的内容一样多)。任何帮助将不胜感激。

4

2 回答 2

1

如果我理解正确,您只需要将 AND 更改为 OR

$tocheck = $db->prepare(
"SELECT users.email
 FROM users,app
 WHERE users.id=app.userid
 AND 
(   
BENELUX=:BENELUX
 OR FRANCE=:FRANCE
 OR GERMANY=:GERMANY
 OR ITALY=:ITALY
 OR NETHERLANDS=:NETHERLANDS
 OR PORTUGAL=:PORTUGAL
 OR SPAIN=:SPAIN
 OR SWEDEN=:SWEDEN
 OR SWITZERLAND=:SWITZERLAND
 OR UK=:UK
)
");
$tocheck->execute($country);
$row = $tocheck->fetchAll();
于 2013-11-07T15:35:07.410 回答
1

你必须更进一步。基本上,您必须查看是否检查了该选项以查看是否在您的用户中实际测试该选项。

例如:

SELECT email 
FROM users u
  INNER JOIN app a on (a.userid = u.id)
WHERE 
     (:BENELUX = 'off' OR a.BENELUX = :BENELUX)
AND (:FRANCE = 'off' OR a.FRANCE = :FRANCE)

ETC..

这样做是将 WHERE 条件限制为仅具有您选择的国家/地区的条件。但是,如果未选择任何国家/地区,则所有条件都将通过,您将获得所有人。因此,您可能希望检查 PHP 代码以确保他们至少选择了一个。

此行表示如果选择了 BENELUX 并且应用表匹配,或者如果未选择 benelux,则允许记录。

 (:BENELUX = 'off' OR a.BENELUX = :BENELUX)

这里and确保前一个条件和这个条件一样为真。

AND (:FRANCE = 'off' OR a.FRANCE = :FRANCE)

现在,这只会拉出与所有选定国家/地区匹配的所有用户。因此,如果他们在法国比荷卢三国进行过滤,则只会选择同时具有法国和比荷卢三国属性的用户


如果您尝试匹配至少选择了一个国家/地区的任何用户,则查询会略有不同:

SELECT email 
FROM users u
  INNER JOIN app a on (a.userid = u.id)
WHERE 
     (:BENELUX != 'off' AND a.BENELUX = :BENELUX)
OR (:FRANCE != 'off' AND a.FRANCE = :FRANCE)

请注意,您不必检查 PHP 以确保他们为此查询选择了至少一个国家/地区。如果他们什么都没选,那么查询将返回零记录。

于 2013-11-07T15:58:35.053 回答