我是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();
这确实会检索数据,但只有那些首选项的用户才会完全匹配(因此他们未选择的内容会与他们拥有的内容一样多)。任何帮助将不胜感激。
答案 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中进行检查,以确保他们为此查询选择了至少一个国家/地区。如果他们没有选择任何内容,那么查询将返回零记录。