2014-01-22 3 views
0

ОК, так что здесь (довольно простой) таблицы Я заинтересован в:Как сделать этот синтаксис лучше?

|===================== 
| objects 
|===================== 
| id | name 
| 

|===================== 
| properties 
|===================== 
| id | name 
| 

|==================================================== 
| object_properties 
|==================================================== 
| id | object_id | property_id | value 
| 

Что мне нужно сделать, это:

  • На основе объекта имя
  • Fetch все Недвижимость Наименование-значение пары

И это мой SQL (который, ac (

SELECT * 
FROM objects, properties, object_properties 
WHERE 
     objects.name="SOME_VALUE" AND 
     object_properties.object_id = objects.id AND 
     object_properties.property_id = properties.id 

Не выглядит ли это хорошо? Что я делаю не так? Я знаю, что мои SQL-навыки близки к несуществующим, поэтому я открыт для предложений!


P.S. Учитывая, что фактический запрос будет выполнен на огромном dataset, что является наиболее эффективным решением?

+0

использует 'joins' не вариант? –

+0

Первое, что соответствует вашей таблице 'objects.value' не существует –

+0

Ummm, objects.value не существует? Это не в таблице объектов. –

ответ

1

Рекомендуемый синтаксис ANSI SQL-92 - использовать JOINS.

SELECT p.name,op.value 
FROM objects o 
INNER JOIN object_properties op 
    ON o.id=op.object_id 
INNER JOIN properties p 
    ON p.id=op.property_id 

WHERE o.value="SOME_VALUE" 

Что вы делаете, это также объединение, но имеет недостаток. Предположим, что в большом запросе, включающем несколько таблиц, вы пропустите условие соединения в своем предложении WHERE. Запрос все равно будет успешно выполнен, так как без условия соединения SQL будет выполнять декартовое произведение между двумя таблицами и возвращать более чем правильное количество строк.

Но в объединении с использованием явно упоминаются ключевым слова JOIN как вывешено выше, если вы пропустите условие соединения, как указано после предложения ON, запрос будет бросать синтаксическую ошибку экономии от отладки для errorneously возвращенного результирующего.

+0

Ну, я думаю, это выглядит хорошо. Не знаю, почему, но я всегда стараюсь избегать использования 'join's, как будто какой-то ужас случится ... lol. Спасибо друг! –

+0

Как насчет производительности? Есть ли что-нибудь, что мы могли бы сделать с вышеуказанным запросом, если нам нужно сосредоточиться на оптимизации его для скорости на больших наборах данных? –

+0

Для оптимизации см. Индексирование - http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html –

1
select properties.name, object_properties.value 
    from objects 
where objects.name = "SOME_VALUE" 
    and object_properties.object_id = objects.id 
    and properties.id = object_properties.property_id 

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

Поскольку ваш ключ является именем объекта, это отправная точка, чтобы ввести фильтр на имя объекта.

С фактического объекта интереса следуйте по цепочке через связанные таблицы. Поскольку объект относится только к объектам, начинайте с этого соединения. Это соединение немедленно делает ценность доступной. Для получения имени свойства требуется еще одно соединение. Извлеките это, присоединив строку свойств объекта к соответствующей строке свойств, чтобы получить доступ к имени свойства.

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

Смежные вопросы