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

时间:2013-11-07 15:29:47

标签: php sql

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

这确实会检索数据,但只有那些首选项的用户才会完全匹配(因此他们未选择的内容会与他们拥有的内容一样多)。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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();

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

等。

这样做会将WHERE条件限制为仅包含您所选国家/地区的条件。但是,如果没有选择国家/地区,则所有条件都将通过,您将获得所有人。因此,您可能希望对PHP代码进行一些检查,以确保它们至少选择了一个。

此行表示如果选择BENELUX则允许记录,如果未选择比荷卢,则应用表匹配OR。

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