Вопрос

I currently have a situation that could easily be solved with 3 SQL queries, but I wonder if it can be done in one query.

I have the following tables:

  symbol                     similarity
  -------                    ------------

  id | name | latex          id | base_symbol_id | similar_symbol_id

I want to SELECT so that my result looks like this:

  query_result
  ------------

  similarity_id | base_formula_id | base_formula_name | base_formula_latex | similar_formula_id | similar_formula_name | similar_formula_latex

Failed tries

I usual solve similar tasks with JOIN. But this time, the SELECT depends on another attribute I select ... I don't know how to do this. Here is my try (which of course failed):

SELECT `base_symbol_id`, `similar_symbol_id`, `latex`
FROM `similarity` 
JOIN `symbol` ON ((`symbol`.`id` = `base_symbol_id`) OR (`symbol`.`id` = `similar_symbol_id`)) 

gives

base_symbol_id | simlar_symbol_id | latex
10             | 11               | \alpha
10             | 11               | a
Это было полезно?

Решение

select sim.id
,base.id
,base.name
,base.latex
,similar.id
,similar.name
,similar.latex
from similarity as sim
join symbol as base on base.id=sim.base_symbol_id 
join symbol as similar on similar.id=sim.similar_symbol_id

Другие советы

Using the given table structure, and making up some random sample inputs in an SQL Fiddle session, the following query would work as you desired:

SELECT T.id as similarity_id, 
      S1.id as base_formula_id, S1.name as base_formula_name, S1.latex as base_formula_latex,
      S2.id as similar_formula_id, S2.name as similar_formula_name, S2.latex as similar_formula_latex
  FROM similarity T
  LEFT OUTER JOIN symbol S1 ON (T.base_symbol_id = S1.id)
  LEFT OUTER JOIN symbol S2 ON (T.similar_symbol_id = S2.id)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top