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.