php ile alanlarında ilk karakter (ler) tarafından mySQL arıyor

5 Cevap php

Ben şu şekilde düzmece bir veritabanı var

id  coach   team                event              status
14  test    8,7,12,13,15        4,1,2,14,4         2 	  	 
13  test    8,12,13,14,15,16    1,2,8,16,16        3 	

I yapmak için neler gerekir "olay" sütunundaki ilk sayı sorgusuna satırlar için arama. Onlar virgülle ayrılır, ancak 1 veya 2 veya 3 basamaklı olabilir. Im emin bu nasıl ve nerede başlar, sadece emin değil, mümkündür.

5 Cevap

Bu olay ilk 1 numara tüm satırları seçecektir:

SELECT * FROM `tableName` WHERE event LIKE '1,%';

Eğer veritabanı normalleştirme düşündünüz mü? Bir alan keyfi biçimlendirilmiş bir değerler keyfi sayıda içerebilir hangi bir veritabanı ile çalışmak için bir ağrı değil mi? Bir yan etki olarak (haha), size söz anlattığım sorunu çözecektir.

Örnek veritabanı şeması:

create table whatever (
    id int not null auto_increment primary key,
    coach varchar(64),
    status int
)

create table teams (
    id int not null auto_increment primary key,
    name varchar(255)
)

create table events (
   id int not null auto_increment primary key,
   name varchar(255)
)

create table whatever_teams (
    id int not null auto_increment primary key,
    whatever_id int,
    team_id int
)

create table whatever_events (
    id int not null auto_increment primary key,
    whatever_id int,
    event_id int
)

Ben her zaman etiketleri "php" ve "mysql" altında sorular ve cevaplar bulunabilir sql enjeksiyon etkin kod bariz eksikliği için şimdiden özür dilemek istiyorum.

Eğer veritabanı düzenini değiştirerek daha iyi olurdu. Kimlikleri listeleri ile alanları saklama çok kullanışlı değil.

Make extra tabels to make the links. For example:

coach_team
id coach_id team_id
1  14       7
2  14       8
3  14       12
4  14       13

: Sizin gibi sorguları kullanabilirsiniz daha

SELECT * FROM table_name WHERE id in
    (SELECT coach_id FROM coach_team WHERE team_id = 1)

(Tabi ki bu da etkinlikleri için de geçerlidir.

Extra information: http://en.wikipedia.org/wiki/Database_normalization

Sen ilk değeri, böyle bir şey almak için SUBSTRING_INDEX kullanabilirsiniz:

SELECT * FROM table_name WHERE SUBSTRING_INDEX( event, ',', 1 ) = 'value'

Bu yaklaşım sayesinde arama değeri için bir yer tutucu ile hazırlanmış bir deyimi kullanabilirsiniz. Sadece bir numara olay sütununda varsa da gayet iyi çalışıyor, karşı maç için mevcut hiçbir virgül yani.

Ben kuvvetle benim deneyim, er ya da geç, gelecekte tüm ihtiyaçlarını karşılamak için değiştirmek zorunda çünkü sizin veritabanı şemasını değiştirmek için tavsiye ederiz. Çok geç be4 şimdi yapmalı