SQL如何使用php检索正确的数据
我是SQL新手,如果问题简单,请原谅 我有一个数据库和几个表。1是用户表,其他是应用程序表,其中包含用户根据感兴趣的国家/地区接收有关该应用程序的通知的首选项 我想做的是检索对该国家感兴趣的所有用户的电子邮件地址。我正在努力思考如何做到这一点。我目前构造了以下查询,以及填充值的代码SQL如何使用php检索正确的数据,php,sql,Php,Sql,我是SQL新手,如果问题简单,请原谅 我有一个数据库和几个表。1是用户表,其他是应用程序表,其中包含用户根据感兴趣的国家/地区接收有关该应用程序的通知的首选项 我想做的是检索对该国家感兴趣的所有用户的电子邮件地址。我正在努力思考如何做到这一点。我目前构造了以下查询,以及填充值的代码 function check($string) { if (isset($_POST[$string])) { $print = implode(', ', $_POST[$string]);
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的帖子不是实时的。否决票可能没有必要:(我没有否决你。我感谢你的帮助。现在,我投票反对你:)谢谢:)非常感谢