2010-11-19 27 views
2

Ben şöyle bilgi sunmak için tabloları bir dizi kullanılabilirlik kılavuz oluşturmak için çalışılıyor:php/mysql - sendika sorguları ile veri bir ızgara oluşturma?

Ben gibi bir sorgu kullanarak Seçilen tarih dönemi için kayıt kümesi oluşturabilir her mekan için
------------------------------------------------------ 
venue  | 22/11 | 23/11 | 24/11 | 25/11 | 26/11 | 
------------------------------------------------------ 
Some venue | £24 | £25 | £32 | N/A | £65 | 
------------------------------------------------------ 
Some venue | £20 | N/A | £22 | £34 | £43 | 
------------------------------------------------------- 

:

SELECT temp_date.queryDate, availability.venueId 
FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId = 7 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate; 

burada anahtar günlerdir doğru sayıda (yani. bir çalışma haftası için 5 kayıt) benim recordset tutarken kullanılamaz herhangi tarihlerde boş bir değer olabilir olmanın.

şöyle birine ben veri setlerini birleştirmek için bir UNION sorgusu kullanılarak basitçe düşündüğünü bu listeye başka yerleri her eklemek için:

(SELECT temp_date.queryDate, availability.venueId 
FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId = 7 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate) 
UNION 
(SELECT temp_date.queryDate, availability.venueId 
FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId = 8 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate); 

10 farklı mekânları demek olan bu ile Benim endişe olabilir sorgulanmak sonra sorguyu çalıştırmak için oldukça uzun bir zaman alabilir.

Sorunuz şu şekildedir: Bir UNION sorgusu burada tek seçeneğim mi yoksa sorgulanan tüm mekanlar için tam hafta sonuçları almamızı sağlamak için kullanabileceğim bir alternatif JOIN var mı?

Umarım bu açık: -S

DÜZENLEME:

alt text

: Aşağıda gerekli kayıt kümesi ekran görüntüleri ve güncel sorgu olduktan sonra

ben olduğum şey belirtmek için alt text

IN() kullanımı şu şekilde önerilir: alt text

cevap

2
SELECT td.query_date, a.venueId 
FROM temp_date td 
CROSS JOIN 
     (
     SELECT 7 AS id 
     UNION ALL 
     SELECT 8 AS id 
     ) ids 
LEFT JOIN 
     availability a 
ON  a.date = td.query_date 
     AND a.id = ids.id 
ORDER BY 
     ids.id, td.query_date 

Ayrıca GROUP BY burada çiftleri işlemek için doğru bir yöntem olmadığını unutmayın.

(date, id) numaralı ürüne availability içinde çift mi giriliyor? Eğer evet ise, bu kopyalardan hangisi seçilmelidir?

+0

Bunun için teşekkürler, yakında bir oyun oynayacağım.Ve hayır, (tarih, kimlik) yinelenen kullanılabilirlik üzerinde mümkün değildir. – simnom

+0

@simnom: "GROUP BY" 'den kurtulursunuz, o zaman gereksizdir. – Quassnoi

+0

Bu parlak bir şekilde çalıştı. Teşekkür ederim. – simnom

1

Neden IN()?

SELECT temp_date.queryDate, availability.venueId 
FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId IN(7, 8) 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate 
+0

Merhaba, bu yola girdim, IN() sadece 5 satır döndürürken, her mekan için 10 satır bir "hafta" istiyorum. – simnom

+0

Asıl soru, daha ayrıntılı olarak ne demek istediğimi belirtmek için değiştirdim. – simnom

0

Evet, kesinlikle, Webnet açıklamasında, venueID'nizi seçmek için IN deyimini kullanabilirsiniz. aslında, sorgu MySQL dışında başka sistemde feryat ediyorum, ve ANSIGROUP BY davranışıyla bile MySQL etkin:

SELECT temp_date.queryDate, availability.venueId 

FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId IN(7, 8) 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate 
+0

@ webnet'in cevabıyla ilgili olarak, bu, temp_date'deki her giriş için yalnızca bir girişle istenen sonucu vermez. İhtiyacım olan her mekan/tarih kombinasyonu için bir mekan/tarih girişi. Bir mekan/hafta için 5 giriş, iki mekan/hafta için 10 giriş. – simnom

+0

Asıl soru, daha ayrıntılı olarak ne demek istediğimi belirtmek için değiştirdim. – simnom

İlgili konular