2012-02-27 11 views
0
私が書いた大きな複雑なクエリで苦労し

イム:SQL - 非常に複雑なクエリ

SELECT e.id, e.name,e.age, e.area, e.date,e.private, e.place, p.*, COUNT(user) AS attending 
FROM events AS e 
LEFT OUTER JOIN 
(SELECT user, event 
FROM attendance 
) AS a 
ON a.event = e.id 
LEFT OUTER JOIN 
(SELECT name AS place_name, id as idd, nz AS place_loc, coor 
FROM places 
) AS p 
ON p.idd = e.place 
where (e.age LIKE "%{17-18}" OR e.age LIKE "%{18-19}" OR e.area LIKE "%{1}" OR e.area LIKE "%{2}" OR e.area LIKE "%{4}" OR e.area LIKE "%{6}" OR e.area LIKE "%{32}" OR e.area LIKE "%{37}" OR e.private LIKE '%id%') 
GROUP BY e.id, e.name 
ORDER BY attending DESC 

limit 0,7 

は、このクエリは、それが出席テーブルによってそれらをソートし、私のイベントを与え、また、それは私の場所についての情報を提供しますイベントがオンであることを示します。

とにかく、問題はどこの地域...すべてのユーザーは異なる年齢と地域を持っています。例: 年齢:{17-18}、{20-22}地域:{0}、{1}、{2}

すべてのイベントは、年齢と地域が同じです。一致するものを見つける:イベントが設定されている場合:年齢 - {15-16}、{17-18}ユーザーが少なくとも1人は設定されていれば一致します。

私は年齢や地域を保存する方法を変更する心をいけない..私は、私は{}を使用して、それをうまくやっておりません確信して、私が望むすべては、彼が市外局番を保存することができ、ユーザの嗜好を設定するための方法であり、そして、私は、イベントから、ユーザーの年齢と地域を特定するイベントのみを選択したいと考えています。

ありがとうございました!非常にお気軽に

+0

うわー、問題は*ただ*どこの領域ではありません。あまりにも多くのサブクエリは必要ありません。外部結合のテーブルを使うことができます... – Konerak

+0

そして、申し訳ありませんが、これは複雑なクエリではありません。複雑なクエリは少なくとも5倍長くなります。テキストファイルに保存すると、*本当に*複雑なクエリは10KBになります。 :) –

+0

場所とエリアは関係していますか?または、「エリア」とは「コンピュータ、ダンス、武道など」のような「関心領域」を意味しますか? –

答えて

4

まず、サブクエリを削除します。ジョインだけを使用してクエリを記述することができます。

SELECT 
    e.id, e.name,e.age, e.area, e.date,e.private, e.place, 
    p.name AS place_name, p.id as idd, p.nz AS place_loc, p.coor 
    COUNT(user) AS attending 
FROM 
    events AS e 
LEFT OUTER JOIN 
    attendance a 
ON 
    a.event = e.id 
LEFT OUTER JOIN 
places p 
ON 
    p.idd = e.place 
WHERE 
    e.age LIKE "%{17-18}" OR e.age LIKE "%{18-19}" OR e.area LIKE "%{1}" OR e.area LIKE "%{2}" OR e.area LIKE "%{4}" OR e.area LIKE "%{6}" OR e.area LIKE "%{32}" OR e.area LIKE "%{37}" OR e.private LIKE '%id%') 
GROUP BY e.id, e.name 
ORDER BY attending DESC 
LIMIT 0,7 

ここでロジックから開始します。なぜあなたはそのようなイベントの年齢を保存していますか?各イベントに最低1つの最大年齢と1つの最大年齢がありますか、または範囲が必要ですか?

あなたのwhere節は、e.minとe.maxの間の単純なuser.ageになります。

複数の範囲でも同じことですが、イベントIDを最小年齢、最大年齢にリンクする '範囲'という表があり、その年齢にイベントに参加します。

+0

、ありがとう、最小と最大の年齢は私にとって良いです...どのような地域については?私は30のエリア(都市)を持っていると言うことができます...どうすればいいですか? – Amir

+0

イベントをエリアにリンクする余分なテーブルを追加します。伝統的には、ID、EVENT_ID、AREA_IDの3つの列が必要です。このテーブルにも参加し、where句にarea_idを含めます。 **あなたは正規化**を読むべきです。 – Konerak