поиск mySQL по первым символам в полях с php - PullRequest
0 голосов
/ 07 января 2010

У меня есть база данных, которая настроена следующим образом

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    

Что мне нужно сделать, так это поиск строк, где первое число в столбце «событие» соответствует запросу. Они разделены запятыми, но это может быть 1 или 2 или 3 цифры. Я уверен, что это возможно, но не знаю, с чего начать.

Ответы [ 6 ]

3 голосов
/ 07 января 2010

Рассматривали ли вы нормализацию своей базы данных? Разве не сложно работать с базой данных, в которой поле может содержать произвольное количество произвольно отформатированных значений? Как побочный эффект (хаха), он решит проблему, которую вы описали в своем вопросе.

Пример схемы базы данных:

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
)

Я хочу заранее извиниться за очевидное отсутствие кода с поддержкой sql-инъекций, который всегда можно найти в вопросах и ответах под тегами "php" и "mysql".

2 голосов
/ 07 января 2010

Тебе было бы лучше, изменив схему базы данных. Хранение полей со списками идентификаторов не очень удобно.

Сделайте дополнительные табели, чтобы сделать ссылки. Например:

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

Чем вы можете использовать такие запросы, как:

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

(Это, конечно, относится и к событиям.

Дополнительная информация: http://en.wikipedia.org/wiki/Database_normalization

2 голосов
/ 07 января 2010

Вы можете использовать SUBSTRING_INDEX , чтобы получить первое значение, примерно так:

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

При таком подходе вы можете использовать подготовленный оператор с заполнителем для значения поиска. Также отлично работает, если в столбце событий есть только одно число, то есть запятые отсутствуют для сопоставления.

2 голосов
/ 07 января 2010

Это выберет все строки, где первое число в событии равно 1:

SELECT * FROM `tableName` WHERE event LIKE '1,%';
1 голос
/ 07 января 2010

Я настоятельно рекомендую вам изменить схему вашей базы данных, потому что по моему опыту, рано или поздно, вы должны изменить ее, чтобы удовлетворить все ваши потребности в будущем. Должен сделать это сейчас будет слишком поздно

1 голос
/ 07 января 2010
$sql = "SELECT * FROM table_name WHERE event LIKE '" . $query . "',%'";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...