2012-02-27 69 views
0

IM有一個大的複雜的查詢我寫的困難時期: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 

該查詢給我的事件,它通過考勤表對其進行排序,並且還讓我牽掛的地方的信息事件正在進行。

無論如何,問題出在WHERE區域......每個用戶都有不同的年齡和地區。例如: 年齡段:{17-18},{20-22}地區:{0},{1},{2}

每個事件都有相同的東西 - 年齡和地區...我試圖找到一個匹配項:

如果設置了事件:年齡 - {15-16},{17-18}並且用戶至少設置了其中一個,它將匹配。

我不介意改變我存儲年齡和地區的方式..我確定我沒有很好地使用{},所有我想要的是設置用戶偏好的方式,他可以保存區號和年齡範圍,然後我想從事件中選擇與用戶年齡和地區相匹配的事件。

非常感謝你!非常友好的

+0

哇,問題不是*只是*地區。你不需要這麼多的子查詢,你可以使用外連接中的表... – Konerak 2012-02-27 16:06:40

+0

而且,很抱歉地說,這不是一個複雜的查詢。一個複雜的查詢至少延長5倍。當保存到文本文件中時,一個*真正*複雜的查詢是10KB。 :) – 2012-02-27 16:07:51

+0

是否有地方和區域相關?還是「區域」是指「感興趣區域」(如電腦,舞蹈,武術等)? – 2012-02-27 16:10:51

回答

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 

現在,啓動邏輯。你爲什麼要存儲這樣的事件年齡?每個事件是否只有一個最小和一個最大年齡,或者您是否需要一個範圍?

對於一個最小和最大年齡,您的where-clause在e.min和e.max之間變成一個簡單的user.age。

對於多個範圍相同的事情,您將有一個將事件ID鏈接到最小年齡,最大年齡的表格「範圍」,並且您會將事件加入到其年齡段。

+0

感謝,最小和最大年齡對我有好處......這些地區呢?可以說我有30個地區(城市)......我該怎麼做? – Amir 2012-02-27 16:21:20

+0

添加一個將事件鏈接到該區域的額外表格。傳統上,需要三列:ID,EVENT_ID,AREA_ID。加入這張表,並在where子句中包含area_id。 **你應該閱讀正常化**。 – Konerak 2012-02-27 16:30:54