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

一歩先に進まなければなりません。基本的に、ユーザーで実際にテストするかどうかを確認するには、オプションがチェックされているかどうかを確認する必要があります。

例えば:

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 コードをチェックして、少なくとも 1 つが選択されていることを確認する必要があります。

この行は、BENELUX が選択されていて app テーブルが一致する場合、または benelux が選択されていない場合にレコードを許可することを意味します。

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

here は、前の条件がこのand条件と同様に真でなければならないことを保証します。

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

これで、選択したすべての国に一致するすべてのユーザーのみがプルされます。したがって、フランスとベネルクスでフィルタリングしている場合、フランスとベネルクスの両方の属性を持つユーザーのみが選択されます。


少なくとも 1 つの国が選択されている任意のユーザーと一致させようとしている場合、クエリは少し異なります。

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)

このクエリで少なくとも 1 つの国が選択されていることを確認するために、PHP でチェックを行う必要はないことに注意してください。何も選択しなかった場合、クエリはゼロ レコードを返します。

于 2013-11-07T15:58:35.053 に答える