Mysql поиск и сортировка в одном запросе с объединенными таблицами - PullRequest
1 голос
/ 16 февраля 2011

У меня есть 3 таблицы в Mysql 5.

Table Client: ID, Username, Password.
Table Client_Data: ID, Dataname
Table Client_Client_Data: client_id, Data_id, Value

Идея состоит в том, что я могу заставить пользователя этого программного обеспечения определять, какую информацию он хочет получить от своих клиентов.Таблица Client_Data обычно заполняется «Имя», «Фамилия», «Адрес» и так далее.Третий стол соединит столы вместе.Пример:

Client: ID=1 Username=Bert01 Password=92382938v2nvn239
Client_Data: ID=1 Dataname=First Name
Client_Client_Data: client_id=1 data_id=1 value=Bert

Это будет означать, что Bert01 имеет имя "Bert" при объединении таблиц в запросе выбора.

Я отображаю все это в таблице, гдестолбцы - это значения DataName (если вы меня здесь потеряли: заголовки будут выглядеть как «Имя», «Фамилия» и т. д.).Я хочу иметь возможность сортировать эти данные по алфавиту для каждого столбца.

Мое решение состояло в том, чтобы использовать 2 запроса.Первый будет собирать данные с помощью WHERE Client_Data.Dataname = $sortBy ORDER BY Client_Client_Data.value, а второй запрос будет затем собирать другие данные с WHERE Client.ID = 1 OR 2 OR 3, содержащие все идентификаторы, собранные в первом запросе.Это прекрасно работает.

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

Есть ли у кого-нибудь какие-либо идеи о том, как сделать это, не беспокоясь о памяти веб-сервера, просматривая циклыпотенциально тысячи клиентов?(имеется в виду: я хочу сделать это в Mysql).

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

1 Ответ

1 голос
/ 16 февраля 2011

вы можете переместить цикл. сделать выбор из всех типов данных

Select * from Client_Data

затем используйте эту информацию для построения запроса, подобного этому (код psuedo)

orderby = "name"
query = "select *"
foreach(datatypes as dt){
 query += ",(select d.value from Client_Client_Data as d where d.data_id="+dt.ID+" and d.client_id=cl.ID) as "+dt.Dataname
}
query = "from Client as cl order by "+orderby;

это приведет к таблице со всеми доступными типами данных, перенесенными в столбец, и соответствующим значением, связанным с правильным желобом клиента d.client_id=cl.ID

, тогда как cl.ID ссылается на идентификатор клиента основных запросов и сопоставляет его с Client_Client_Data.client_id

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

...