Прежде всего, не вставляйте поле 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 будет много строк, это не очень хороший вариант.