Esta pergunta procura uma resposta em sql puro (sem código específico do servidor db)
-edit- Devidos comentários/respostas: "pure sql" - SQL92/99 porque funciona em todos os servidores. Eu não uso esse código apenas no mysql, esse foi apenas o primeiro que tentei. Eu tenho que suportar Microsoft SQL Server (2000!), h2, PostGRE SQL e MySQL Server, mas o código também deve funcionar em outros (servidor db independente). Sinto muito se "pure sql" não foi detalhado o suficiente. Da próxima vez, especificarei o requisito da revisão do SQL (3/4, 92/99)
Eu tenho que ser compatível com versões anteriores. E é por isso que não especifiquei um servidor db. Isso foi de propósito. -fim-da-edição-
Eu tento pegar todos os valores de uma tabela com limites dados. Os dados que tenho para a consulta são: possíveis localidades e um max_priority
esta é a mesa para trabalhar
SELECT * FROM i18n
.
id|featureName|locale |priority|text
--+-----------+-----------+--------+----
1| type | en| 1|father
2| type | de| 2|Vater
3| type | de_AT| 3|Papa
4| type | de_AT_Wien| 4|Oida
5| firstName | en| 1|first name
6| firstName | de| 2|Vorname
7| lastName | en| 1|last name
8| lastName | de| 2|Nachname
9| lastName | fr| 2|nom de famille
10| firstName | fr| 2|prénom
então, por exemplo , eu tenho en
, e um max_priority de 3 (que é a prioridade de ) espero isso como resultado: (a ordem desses resultados não é importante!)de
de_AT
de_AT
id|featureName|locale |priority|text
--+-----------+-----------+--------+----
3| type | de_AT| 3|Papa
6| firstName | de| 2|Vorname
8| lastName | de| 2|Nachname
tentei resolver isso com um left outer join
este é o melhor resultado que consegui obter:
SELECT DISTINCT nls1.*
FROM i18n nls1
LEFT OUTER JOIN i18n nls2
ON (
nls1.featureName = nls2.featureName
and nls1.priority > nls2.priority
)
WHERE nls2.priority<=3
AND (nls1.locale='en' OR nls1.locale='de' OR nls1.locale='de_AT')
GROUP BY featureName
ORDER BY featureName, priority DESC
mas isso seleciona essas linhas:
id|featureName|locale |priority|text
--+-----------+-----------+--------+----
2| type | de| 2|Vater
6| firstName | de| 2|Vorname
8| lastName | de| 2|Nachname
outra tentativa foi
SELECT nls2.*
FROM i18n nls2
JOIN (SELECT Max(priority) max_priority,
featurename,
priority
FROM i18n nls
WHERE ( locale = 'en'
OR locale = 'de'
OR locale = 'de_AT' )
AND priority <= 3
GROUP BY featurename) nls3
ON nls3.priority = nls2.priority
AND nls3.featurename = nls2.featurename
mas este só retorna a versão en...
id|featureName|locale |priority|text
--+-----------+-----------+--------+----
1| type | en| 1|father
5| firstName | en| 1|first name
7| lastName | en| 1|last name
NOTA: atualizarei a pergunta dependendo das respostas.
O principal problema parece que eu preciso de group by
um column
, mas o grupo também precisa de um order by
?
Sem funções de janela, a consulta será complicada. Uma maneira de resolver o problema no MySQL:
Observe também que a consulta acima falhará no SQL Server (que usa
TOP
, nãoLIMIT
) e possivelmente também falhará em outro DBMS.Com o SQL moderno , isso pode ser facilmente resolvido usando funções de janela:
O acima é SQL padrão sem nenhum código específico de DBMS