çok-çok veri alanları ile sorgu oluşturulan tablolar, en iyi uygulama?

1 Cevap php

Siz iki varsayımsal tablo var:

TABLE 1
[id]  [item]  [amount]  [cost]
 1     hat     20        10
 2     shoe    7         45
 3     belt    2         25

TABLE 2 (many to many)
[item]  [color]
 hat     blue
 hat     red
 hat     yellow
 shoe    black
 shoe    white
 etc.    etc.

Eğer bir sorgu çalıştırdığınızda ve çıkış için böyle hem tüm verileri içeren bir liste istiyorum:

[ITEM]  [AMOUNT]  [COST]  [AVAILABLE COLORS]
 hat     20        10      blue, red, yellow
 shoe    7         45      black, white
 etc.

Renkleri mevcut olmasaydı, bu bir tablodan tüm bu bilgi kapmak ve bir döngü dizi işlemek için tek bir sorgu olurdu. Ama karşılamak için TABLE 2 Ben bunu iki şekilde düşünebilirsiniz:

Brute Force: TABLE 2, virgül eklemek, ve TABLE 1, daha sonra çıkış HTML tablosundan sonuçları dizi takın gelen verileri almak için her dönüş için bir sorgu çalıştırmak

Ugly Workaround: Table 1 için yeni bir sütun eklemek ve periyodik perde arkasında Table 2 veri dizeleri ile güncellemek

... Daha iyi bir yolu, doğru var?

1 Cevap

MySQL ile çalışıyorsanız, GROUP_CONCAT fonksiyon İlginizi çekebilir.

Örneğin bu soruya bakın: Can I concatenate multiple MySQL rows into one field?


Else, the "brute force" solution you described is generally the one that's used -- a possible optimization being to do only 1 query to get lines from the second table that correspond to all lines from the first table at once.

Örneğin, olur:

  • ilk tablodan bu verileri almak için sorgu yapmak
  • select * from table_2 where item in ('hat', 'shoe', 'belt') gibi bir şey - ilk tablodaki verilere karşılık ikinci tablodaki tüm verileri almak için bir sorgu yapmak
  • İlki sonuçlarına ikinci sorgudan sonuç "yenkimliken takmak" için PHP tarafında bir döngü kullanmak

Bu çözüm ile, PHP tarafında biraz daha fazla iş yapacağız, ama sadece 2 sorgular yerine - 1 + ve (hat sayısı ilk sorgudan döndürülen); Eğer hatları çok ilk sorgudan döndürülen olduğunda, genellikle çok daha iyi olan.