Как вернуть все пары ключ / значение для нескольких идентификаторов записей (MySQL)? - PullRequest
0 голосов
/ 09 ноября 2010

У меня есть 2 таблицы со следующей структурой ...

Table cellphone_tokens:
-----------
| id (pk) |
| model   |
-----------

Table cellphone_keys_vals:  
-----------
| cell_id |
| key     |
| value   |
-----------

cell_id - это id соответствующей модели в первой таблице. Для удобства я снова ввел model во второй таблице.

Предположим, мне нужно выбрать все keys и values для определенного model (или до 4 моделей). Как я могу написать запрос для достижения этой цели?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2010

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

Во-вторых, кажется, что вы используете вертикальную схему для своей таблицы cellphone_keys_vals.Это может быть полезно, если есть куча ключей, которые не очень часто используются.Но более распространенным и более эффективным является использование горизонтальной схемы, где каждый ключ является полем.Скажем, есть 3 «ключа»: цвет, цена, размер.Ваша таблица cellphone_key_values ​​становится таблицей cellphone:

cell_id INT UNSIGNED NOT NULL PRIMARY KEY,
token_id INT UNSIGNED NOT NULL,
colour VARCHAR(10),
price DECIMAL(5,2),
size ENUM('s','m','l'),
CONSTRAINT `FK_cellphone1` FOREIGN KEY (`token_id`) REFERENCES `cellphone_tokens` (`id`)

Тогда все просто:

SELECT c.cell_id, t.model, c.colour, c.size, c.price FROM
cellphones c JOIN cellphone_tokens t ON (c.token_id=t.id)

получает ВСЕ мобильные телефоны, включая их модели.Если вы хотите ограничить конкретный набор моделей, вы можете добавить предложение WHERE:

SELECT c.cell_id, t.model, c.colour, c.size, c.price FROM
cellphones c JOIN cellphone_tokens t ON (c.token_id=t.id)
WHERE t.model IN ('blah','foo','bar')

Если вы хотите ограничить до 4 моделей и , вы нене важно, какие модели могут работать:

SELECT c.cell_id, t.model, c.colour, c.size, c.price FROM
cellphones c JOIN cellphone_tokens t ON (c.token_id=t.id)
WHERE t.model IN (SELECT id FROM cellphone_tokens ORDER BY rand() LIMIT 4);

Обратите внимание, что ORDER BY rand() довольно неэффективно, поэтому, если в вашей таблице cellphone_tokens будет много строк, это не очень хороший вариант.

0 голосов
/ 09 ноября 2010

Вы можете использовать внутренний запрос:

SELECT
 v.*
FROM cellphone_keys_vals AS v
WHERE v.cell_id IN (
    SELECT
          t.id
    FROM cell_phone_tokens as t
            WHERE t.model IN ("model1", "model2")
      )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...