SQL如何使用php检索正确的数据

SQL如何使用php检索正确的数据,php,sql,Php,Sql,我是SQL新手,如果问题简单,请原谅 我有一个数据库和几个表。1是用户表,其他是应用程序表,其中包含用户根据感兴趣的国家/地区接收有关该应用程序的通知的首选项 我想做的是检索对该国家感兴趣的所有用户的电子邮件地址。我正在努力思考如何做到这一点。我目前构造了以下查询,以及填充值的代码 function check($string) { if (isset($_POST[$string])) { $print = implode(', ', $_POST[$string]);

我是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();

这确实可以检索数据,但只有偏好完全匹配放置内容的人(因此,他们没有选择的内容将与他们拥有的内容一样受到重视)。任何帮助都将不胜感激。

如果我理解正确,您只需将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();

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

例如:

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)
等等

这样做的目的是将WHERE条件限制为仅适用于您所选国家/地区的条件。但是,如果没有选择任何国家,那么所有条件都将通过,您将获得所有人。因此,您可能希望在PHP代码中进行一些检查,以确保他们至少选择了一个

该行表示如果选择了比荷卢,且应用程序表匹配,或者如果未选择比荷卢,则允许记录

 (:BENELUX = 'off' OR a.BENELUX = :BENELUX)
此处的
确保前一个条件必须与此条件一样为真

AND (:FRANCE = 'off' OR a.FRANCE = :FRANCE)
现在,这只会吸引与所选国家的所有匹配的所有用户。因此,如果他们在法国和比荷卢三国进行过滤,那么只有那些同时具有法国和比荷卢三国属性的用户才会被选中

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

如果您试图匹配至少有一个选定国家的用户,则查询略有不同:

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中进行检查,以确保他们为此查询选择了至少一个国家。如果他们没有选择任何记录,那么查询将返回零记录。

使用
而不是
(我的工作完成了)这是否意味着如果用户“off”与数据库中的“off”匹配,它将返回该用户?所以它总是会返回每个用户?@Programatt:是的,Fred、Legionar和Rich提供的查询将提取所有记录。@Programatt:请参阅更新。根据您对搜索代码的期望,我给出了两种可能的解决方案。谢谢!但与上面相同:这是否意味着如果用户“off”与数据库中的“off”匹配,它将返回该用户?所以它总是会返回每个用户?对不起,当我发布我的答案时,Chris的帖子不是实时的。否决票可能没有必要:(我没有否决你。我感谢你的帮助。现在,我投票反对你:)谢谢:)非常感谢