Başka bir mysql tablodan bilgi almak

4 Cevap php

Belirli bir ay hakkında bilgi içeren yeni bir tablo var, ve bu satır bir sütun birden fazla bilgi kapmak için ona başka bir tablo için mysql satır id olurdu

kimlikleri patlayan ve her biri üzerinde ayrı sql queryies yapıyor daha bilgi almak için daha verimli bir yolu vardır ... Burada bir örnek:

Row ID | Name | Other Sources
1        Test   1,2,7

Other Sources böylece gibi diğer tablodan satır id var

Row ID | Name | Information  | Link
1        John | No info yet? | http://blah.com
2        Liam | No info yet? | http://blah.com
7        Steve| No info yet? | http://blah.com

ve genel bilgiler döndü bozkır altında gibi

Hi this page is called test... here is a list of our sources
- John (No info yet?) find it here at http://blah.com
- Liam (No info yet?) find it here at http://blah.com
- Steve (No info yet?) find it here at http://blah.com

ben bunu yapmak istiyorum ... i tarafından diğer kaynaklardan patlayabilir, ve sonra her biri için ayrı bir SQL sorgusu yapardı, ben daha iyi bir yolu olabilir eminim?

4 Cevap

Klasik bir çok-çok ilişkisi gibi görünüyor. Sayfaları ve kaynaklarına sahip - her sayfa birçok kaynak var ve her kaynak birçok sayfa için kaynak olabilir?

Neyse ki bu çok ilişkisel veritabanı tasarımı çözülmüş bir sorundur. Birlikte iki ilişkilendirmek için 3 tablo kullanabilirsiniz:

Pages (PageID, Name)
Sources (SourceID, Name, Information, Link)
PageSources (PageID, SourceID)

"PageSources" tablo için anahtar SayfaKimliği ve SourceID hem de olacaktır.

Daha sonra, örneğin bir sayfa için tüm kaynaklarını elde etmek için, bu SQL kullanabilirsiniz:

SELECT s.* 
FROM Sources s INNER JOIN PageSources ps ON s.SourceID = ps.SourceID
AND ps.PageID = 1;

Değil kolayca tablo yapısı ile. : Sizin gibi başka bir tablo olsaydı

ID    Source
1     1
1     2
1     7

Sonra join senin arkadaşın. Şeyler bunlar yolu ile, "Diğer Kaynaklar" alanına virgülle ayrılmış değerler bazı pis yarma yapmak gerekecek.

Belki (bilinmektedir) belirgin bir şey eksik, ama neden yerine, basit bir birleştirme tablo daha değerleri virgülle ayrılmış seti ile ilk tablodaki tek bir alanı kullanıyor. Eğer çözüm bu saçmadır yok.

Bu tablolar ile sorun bir çok değerli sütunu olan SQL ile iyi çalışmıyor olmasıdır. Çok değerli sütunlar üzerinde First Normal Form yasak ve gibi bu formatta tablolar, normalized olarak kabul edilir.

Birinci Normal Form demektir ...

  1. Satırlara hiçbir üst-to-bottom sipariş var.
  2. Sütunlara hiçbir sol-sağ sipariş var.
  3. Hiçbir yinelenen satırlar vardır.
  4. Every row-and-column intersection contains exactly one value from the applicable domain (and nothing else).
  5. All columns are regular [i.e. rows have no hidden components such as row IDs, object IDs, or hidden timestamps].

"Ne Birinci Normal Form Gerçekten Means"-Chris Tarih, pp 127-8 [4]

Her neyse, bunu yapmak için en iyi yolu, birçok ilişki için bir çok sahip olmaktır. Dominic Rodger onun cevabını yaptığı gibi bu, ortada üçüncü bir tablo koyarak yapılır.