1

これはもっと「アプローチ」の質問です、私はまだコードに到達していません。しかし、SQLとphpは初めてであり、この問題にインテリジェントに取り組みたいと考えています。

シナリオは次のとおりです。

Donationsというテーブルがあり、各テーブルのAREAという列に文字列値が1つだけあります。AREAは、9つの所定の値(北東、北西、ダウンタウンなど)のいずれかを持つことができます。

また、ボランティアの表もあります。各ボランティアは、寄付を受け取るのに役立つ、旅行先の地域を指定しています。ボランティアごとに、上記の9つの領域(NW、NE、DTなど)に対応する1または0の9つの列があります。

クエリ、一連のクエリ、またはphp / sqlの組み合わせを実行して、アクティブな寄付をすべて検索し、それらが含まれているAREAを取得してから、ボランティアテーブルにクエリを実行し、それらのみのメールアドレスのリストを取得したいと思います。これらの地域の1つまたは複数に旅行することをいとわないボランティア。

どんな助けでも大歓迎です。(余談ですが、これら2つのテーブル間で共有されるキー値はありません。)

4

4 に答える 4

1

Areasを独自のテーブル(ID、Name)にすることを検討します。次に、寄付テーブルに、Area文字列列の代わりにAreaID(ForeignKey)を追加します。

Volunteers-Areas Associationの場合、VolunteerID、AreaIDの構造を持つVolunteerAreasという名前のリンクテーブルを作成することを検討します。

既存のデータを取得して新しい形式にダンプするスクリプトを作成するのは簡単なはずです。

その後、あなたはすることができます...

積極的な寄付を得る

SELECT * FROM Donations WHERE Active = 1

選択したエリアからメールを取得する

SELECT Email FROM Volunteers v
JOIN VolunteerAreas va ON va.VolunteerID = v.ID
WHERE va.AreaID = @AreaID
于 2012-06-06T18:24:02.200 に答える
0

それで、私はまったく異なる方法でこれを解決しましたが、上記の方法はうまくいったと確信しています。

各エリアに2、3、5などの素数を割り当てて作成しました。ボランティアが登録すると、行きたいエリアに掛けてコードを作成します。

私は寄付に同じ素数を使用し、各寄付に適切な素数を割り当てました。

次に、この結合クエリを実行して、ボランティアのコードが利用可能な寄付のいずれかで均等に分割できるかどうかを確認しました。

$ q = "Select Distinct(EMAIL)from PUPS where EXISTS(Select * from Donations where STATUS ='ACTIVE' AND(REGIONCODE Mod AREAPRIME = 0))";

于 2012-06-21T22:22:53.840 に答える
0

最初のクエリは次のようになります

SELECT [area] FROM [database] WHERE donationSelector = selectedValue

次に、上から取得した変数に$i基づいて、変数を列名に設定します$area

<?php
switch($area) {
    case "Northwest" :
        $i = "NW";
        break;
    case "Northeast" :
        $i = "NE";
        break;
    ...etc.
}

次に、別のクエリを実行します

SELECT * FROM [database] WHERE %s = 1, $i
于 2012-06-06T18:25:14.933 に答える
0

2つではなく複数のテーブルを使用して、スキーマを変更することを強くお勧めします。

以下のSQLは、主キー、外部キー、インデックスなどを含まないスケルトンです。

CREATE TABLE area (
  id           INT NOT NULL AUTOINCREMENT,
  name         VARCHAR(128)
)

CREATE TABLE volunteer (
  id           INT NOT NULL AUTOINCREMENT,
  name         VARCHAR(128)
)

CREATE TABLE coverage (
  area_id      INT,
  volunteer_id INT
)

まず、最初の2つのテーブルのそれぞれで代理主キー(id列)を使用すると、何も壊さずにエンティティの名前を変更できることを意味します。

次に、新しい領域を追加するときに、ボランティアテーブルに新しいバイナリフラグフィールドを追加するのではなく、各テーブルに新しいレコードを追加するだけで済みます。

第三に、クエリは非常にすっきりし、保守しやすく、高速になります...

SELECT
  volunteer.*
FROM
  area
INNER JOIN
  coverage
    ON area.id = coverage.area_id
INNER JOIN
  volunteer
    ON volunteer.id = coverage.volunteer_id
WHERE
  area.name IN ('NW', 'SE')
GROUP BY
  volunteer.id
于 2012-06-06T18:28:10.113 に答える