seçme sorgusu sorunu mysql

4 Cevap php

i have a form that has a multiple select drop down. a user can select more than one options in the select. the name of the select is array[]; using php I call implode(",",$array) in mysql db, it stores the field as a text in this format "places"= "new york, toronto, london" when i want to display these fields i explode the commas.

Ben yerleri görüntülemek için bir rapor çalıştırmak için çalışıyorum. burada benim seçmektir:

"select * from mytable where db.places .. userSelectedPlaces"

nasıl ben "yerlerden" listelerinde kullanıcı seçilmiş olduğunu toronto kontrol edebilirim? db "yerleri" notu olabilir ya olmak sadece "toronto" ya da virgül "vb ny, toronto, londra, paris," gibi yerlerin listelerini ayrılmış olabilir.

4 Cevap

Mümkün ise, kullanıcının seçtiği yerleri tutmak için başka bir tablo kullanarak çok daha iyi olurdu. Çağrı SelectedPlaces sütunlu:

  • mytable_id - sorgunuza masaya geri katılmak için
  • place - EG: "Toronto"

Sonra Toronto seçilmiş olmadığını anlamaya basit bir sorgu çalıştırabilirsiniz:

SELECT * 
  FROM mytable m
 INNER JOIN SelectedPlaces sp ON sp.mytable_id = m.id
 WHERE sp.place = 'Toronto'

Ben doğru anlamak, veritabanı tasarımı sadece yanlış. Bu konuda daha fazla okumaya çalışın. Genel olarak, iyi bir tasarım size veritabanındaki bir alan olarak değerleri listeleri olmamalıdır ve bunun için yeni bir tablo tanıtmak gerekir.

Bunu bu şekilde yapmak istiyorsanız Ancak, strcmp işlevini kullanabilirsiniz.

Eğer doğru anladıysam, bu çalışması gerekir:

WHERE DB.PLACES LIKE '%TORONTO%' 

Diğer kullanıcıların dediği gibi değil, onun değil güzel bir şey tabloları denormalized etmiş.

Doğrudan soruyu cevaplamak için, sorgu böyle bir şey bakmak gerekiyor

SELECT *
  FROM mytable
 WHERE places LIKE( '%toronto%' )

Ama GİBİ () yavaş olduğunu, farkında olmak.

Dolaylı soruyu cevaplamak için, veritabanı şema yanlış. Bu bir M yapmak için doğru bir yol değildir: N (çok-çok) ilişkisi.

Bu yerine vardı düşünün

mytable         place                    mytable_place            
+------------+  +----------+----------+  +------------+----------+ 
| mytable_id |  | place_id | name     |  | mytable_id | place_id | 
+------------+  +----------+----------+  +------------+----------+ 
| 1          |  | 1        | new york |  | 1          | 1        | 
| 2          |  | 2        | toronto  |  | 1          | 2        | 
| 3          |  | 3        | london   |  | 1          | 3        | 
+------------+  +----------+----------+  | 2          | 2        | 
                                         | 3          | 1        | 
                                         | 3          | 3        | 
                                         +------------+----------+ 

Tablo mytable_places, bir arama tablosu (ya da, xref / çapraz referans tablosu, ya da korelasyon tablo) olarak adlandırılan şeydir. Onun sadece iş tersi mytable kaydına place kayıtları var olan izlemek ve tutmaktır.

Bu örnekte biz 1 mytable kayıt all 3 yerler vardır, 2. yalnızca toronto, ve 3. olan new york görebilirsiniz ve london.

Bu size mevcut tasarımı ile zor, pahalı ya da imkansız olurdu sorguları da her türlü açılır.

Kaç mytable kayıtları toronto var bilmek ister misiniz? Sorun yok

SELECT COUNT(*)
  FROM mytable_place x
  LEFT JOIN place p
    ON p.place_id = x.place_id
 WHERE p.name = 'toronto';

Nasıl bir yerde başına mytable kayıtları kriteri sayısı hakkında?

SELECT p.name
     , COUNT(*) as `count`
  FROM mytable_place x
  LEFT JOIN place p
    ON p.place_id = x.place_id
 GROUP BY p.place_id
 ORDER BY `count` DESC, p.name ASC

Ve bu böyle place.name olarak sütunlar üzerinde dizin kullanabilirsiniz beri GİBİ kullanarak herhangi bir sorgu daha much daha hızlı olacak.