Нужен запрос MySQL для выбора из таблицы, хранящей пары ключ-значение - PullRequest
4 голосов
/ 26 ноября 2010

Мне нужно хранить несколько элементов и их свойств в виде пар ключ-значение в базе данных (mySQL). Я планирую сделать это следующим образом.

Я буду использовать две таблицы items и item_properties.

items

 itemId | itemName 
-------------------
 1923   | AC
 1235   | Fridge
 8273   | Heater

item_properties

 itemId | property    | value
--------------------------------
 1923   | effect      | cooling
 1923   | consumption | efficient
 1923   | type        | split
 1235   | effect      | cooling
 1235   | volume      | 20 liters
 8273   | effect      | heating
 8273   | consumption | efficient
 8273   | heatMethod  | coil

Теперь, если мне нужно выбрать элементы, чей «эффект» - «охлаждение», я могу сделать это, используя следующий запрос (который даст мне «AC» и «Fridge» в результате).

SELECT itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId 
AND (p.property = 'effect' AND p.value ='cooling');

Я хотел бы знать, как писать запросы для выбора элементов, которые соответствуют нескольким свойствам, таким как

  • выберите все элементы, у которых «эффект» - «охлаждение» И «потребление» - «эффективный» (что соответствует элементу «АС»).
  • выбрать все элементы, чей «тип» - «раздельный» ИЛИ «heatMethod» - «катушка» ИЛИ «потребление» - «эффективный» (что соответствует элементам «AC» и «Нагреватель»).

Пожалуйста, помогите ... Заранее спасибо !!

Ответы [ 2 ]

7 голосов
/ 26 ноября 2010

Вот пример запроса:

SELECT
  itemName
FROM
  items i,
JOIN
  item_properties effect
  ON i.itemId = effect.itemId AND effect.property = 'effect'
JOIN
  item_properties consumption
  ON i.itemId = consumption.itemId AND consumption.property = 'consumption'

WHERE effect.value = 'cooling' AND consumption.value = 'efficient';

Я оставлю запрос oR как то, что вы можете попробовать сами.Это просто добавление дополнительных таблиц и использование OR вместо AND в WHERE.

2 голосов
/ 26 ноября 2010

Привет!

Я думаю, что ваш исходный запрос может быть неправильным ... если в вашей таблице item_properties есть столбцы с именем (itemId, property, value), тогда ваш запрос должен быть:

SELECT i.itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId AND p.property='cooling';

Кроме того, вы выполняете здесь «неявные объединения», и я не знаю, сколько вы хотите узнать о SQL по сравнению с просто желанием заставить что-то работать, но есть другой способ написать ваши запросы, которые, я думаю,возможно, лучше, если вы планируете какое-то время придерживаться баз данных SQL.Это не страшно, просто мне легче читать вторую форму.

Ваш исходный запрос:

SELECT itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId AND p.property='cooling';

Будет переписан с использованием синтаксиса соединения:

SELECT i.itemName FROM items i 
JOIN item_properties p ON i.itemId=p.itemId WHERE p.property='cooling';

Я постараюсь дать обе формы в ответ на ваши вопросы ...

выбрать все элементы, чей «эффект» - «охлаждение» И «потребление» - «эффективный» (что соответствует элементу »)AC ').

select itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId AND (p.property='cooling' AND p.value='consumption');

select i.itemName FROM items i JOIN item_properties p ON i.itemId=p.itemId 
WHERE p.property='cooling' AND p.value='consumption';

выбрать все элементы, чей «тип» - «раздельный» ИЛИ «heatMethod» - «катушка», ИЛИ «потребление» - «эффективный» (что соответствует элементам «АС» и «Утеплитель ').

select itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId AND ((p.property='type' AND p.value='split') OR 
(p.property='heatMethod' AND p.value='coil') OR 
(p.property='consumption' AND p.value='efficient'));

select itemName FROM items i JOIN item_properties p ON i.itemId=p.itemId 
WHERE (p.property='type' AND p.value='split') OR 
(p.property='heatMethod' AND p.value='coil') OR 
(p.property='consumption' AND p.value='efficient');

Надеюсь, это поможет!

...