/ / Jak ulepszyć tę składnię? - mysql, sql

Jak ulepszyć tę składnię? - mysql, sql

OK, więc tu są (raczej proste) stoły, które mnie interesują:

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

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

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

Muszę to zrobić:

  • Na podstawie obiekt Nazwa
  • Pobierz wszystko własność Pary wartości nazw

I to jest mój SQL (który w rzeczywistości pobiera wszystko):

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

Czy to wygląda dobrze? Co ja robię źle? Wiem, że moje umiejętności SQL są bliskie zeru, więc jestem otwarty na sugestie!


P.S. Biorąc pod uwagę, że faktyczne zapytanie zostanie wykonane na olbrzymi zbiór danych, jakie jest najbardziej wydajne rozwiązanie?

Odpowiedzi:

1 dla odpowiedzi № 1

Zalecaną składnią ANSI SQL-92 jest użycie 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"

To, co robisz, implementuje również łączenie, ale ma wady. Załóżmy, że w dużym zapytaniu obejmującym wiele tabel tracisz warunki łączenia w swoim WHERE klauzula. Kwerenda nadal będzie pomyślnie wykonana bez warunku łączenia, SQL wykona produkt kartezjański pomiędzy dwiema tabelami i zwróci więcej niż poprawną liczbę wierszy.

Ale przy dołączaniu za pomocą wyraźnie wymienionego słowa kluczowego JOIN jak napisano powyżej, jeśli przegapisz warunki łączenia określone po ON klauzula spowoduje, że zapytanie zwróci błąd składni podczas debugowania dla błędnie zwróconego zestawu wyników.


1 dla odpowiedzi nr 2
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

Ponieważ chcesz mieć nazwę właściwości i wartość właściwości obiektu, są to jedyne pola na mojej liście wyboru.

Ponieważ twój klucz jest nazwą obiektu, jest to punkt wyjścia do wprowadzenia filtra na nazwę obiektu.

Z rzeczywistego obiektu zainteresowania, wykonajłańcuch przez powiązane tabele. Ponieważ obiekt odnosi się tylko do właściwości object_properties, zacznij od tego sprzężenia. To połączenie natychmiast udostępnia wartość. Do uzyskania nazwy nieruchomości potrzebne jest jeszcze jedno przyłączenie. Opuść to, dołączając do wiersza właściwości obiektu do odpowiedniego wiersza właściwości, umożliwiając dostęp do nazwy właściwości.

Składnia ta, nawiasem mówiąc, jest "starym stylem" SQL gdziepołączenia i filtry są mieszane w jedną klauzulę WHERE. Nowoczesny styl dzieli je dla większej przejrzystości, i jestem pewien, że dostaniesz kilka odpowiedzi pokazujących bardziej nowoczesną składnię ;-)