Сортировка результатов запроса MySQL по нескольким столбцам - PullRequest
1 голос
/ 13 августа 2011

У меня есть таблица со списком людей, разрешенных в здании. Каждому резиденту разрешено предоставлять доступ 10 нерезидентам.

resident guest1 guest2 ... guest10

Я хочу найти всех гостей, а затем отобразить результаты в алфавитном порядке. В настоящее время у меня есть:

$result = mysql_query("SELECT * FROM residentlist WHERE guest1 LIKE 'searchquery' OR guest2 LIKE 'searchquery' ... OR guest10 LIKE 'searchquery'";

Но я получаю дополнительных гостей, которые не похожи на 'searchquery', поэтому мне нужно сделать еще несколько if проверок.

Я новичок в mysql - мне не хватает чего-то простого?

Кроме того, я открыт для реструктуризации таблиц / добавления таблиц, если так будет лучше.

Ответы [ 3 ]

2 голосов
/ 13 августа 2011

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

Да, это должно быть изменено, чтобы быть отдельной таблицей, которая просто Resident, Guest. Максимум 10 следует применять на стороне приложения, а не базы данных. См. Ответ Ши для превосходного объяснения того, как его структурировать, двигаясь вперед.

Если вам необходимо сохранить текущую структуру, вы можете получить желаемые результаты с помощью оператора UNION.

SELECT guest1 FROM residentlist WHERE guest1 LIKE 'searchquery' 
UNION SELECT guest2 FROM residentlist WHERE guest2 LIKE 'searchquery' 
...
UNION SELECT guest10 FROM residentlist WHERE guest10 LIKE 'searchquery' 
2 голосов
/ 13 августа 2011

Вы должны реструктурировать таблицы.Создайте новую таблицу с именем access или что-то с полями accessId, residentId и guest.

  • accessId - это первичный ключ, это AUTO_INCREMENT INTEGER.
  • resident - это внешний ключ к таблице residentlist.
  • guest - это то, что вы сейчас ищете, используя условие LIKE.

Так что для ваших 10 гостейна каждого резидента у вас будет 10 записей в этой таблице access.

Получив это, вы можете использовать запрос:

SELECT * FROM residentlist LEFT JOIN access ON access.residentId = residentlist.resident WHERE guest LIKE '<search query>';

0 голосов
/ 13 августа 2011

Я чувствую, что база данных могла бы быть лучше организована.Как правило, если у вас есть имя поля blah1, blah2, ... blahX, обычно это красный флаг.

В любом случае звучит так, как будто у вас есть два объекта: гость и резидент, а затем отношения между ними.

Таким образом, вы можете иметь резидентную таблицу с информацией о резиденте иуникальный идентификатор резидента, такой как residentId.Итак, у вас есть:

  • ResidentId
  • Имя
  • Адрес ....

Тогда у вас есть гостевая таблица, в которой указывается информацияо гостях:

  • GuestId
  • Имя
  • все остальное ...

Тогда у вас есть третий стол, который на самом деле имеет отношениегость и резидент (guestToResidentTable).Это будет иметь два поля:

  • ResidentId
  • GuestId
  • вы также можете захотеть уникальный идентификатор для каждого из этих отношений - создание трех полей в этомтаблица

    Оба поля идентификатора являются внешними ключами от других ваших таблиц.

Таким образом, каждый гость будет связан с каждым резидентом, и, как сказал Дерек, вы обязываете 10 гостейограничение в вашем приложении (не в базе данных).

Затем вы можете искать в гостевой таблице всех гостей, как ваш поисковый запрос.Если вам нужна информация о госте и с каким резидентом он связан, просто присоединяйтесь к другим столам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...