поиск mySQL по первым символам в полях с php

0

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

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 ответов

2
Лучший ответ

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

SELECT * FROM `tableName` WHERE event LIKE '1,%';
  • 0
    @martin Действительно, я исправил свой пример, чтобы решить эту проблему
  • 1
    Что с понижением? Это правильный ответ на его вопрос, и предложение LIKE будет использовать индекс для столбца события, если он доступен в этом случае.
3

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

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

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-injection, который всегда можно найти в вопросах и ответах под тегами "php" и "mysql".

2

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

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

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

  • 0
    Это зависит от сценария использования. Для его нужд может быть более эффективно сохранить все как есть и избежать подзапроса. Операция LIKE в его случае также будет использовать индекс, если он доступен для столбца.
  • 0
    До тех пор, пока он не захочет другой идентификатор события, кроме первого.
Показать ещё 1 комментарий
2

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

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

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

1

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

1
$sql = "SELECT * FROM table_name WHERE event LIKE '" . $query . "',%'";

Ещё вопросы

Сообщество Overcoder
Наверх
Меню