MySQL Help: table2.id selecionar onde ... table1.date é maior
Pergunta
Eu tenho 2 mesas, usando uma junção interna para consultá-los.
SELECT COUNT(table2.id)
FROM table2
INNER JOIN table1 ON table2.relazioneid = table1.id
WHERE table1.date > ? AND table1.date < ?
Ele conta os ids de entradas em relatórios entre 2 datas. A Tabela 1 contém informações sobre os relatórios (data, groupid etc), table2 detém as entradas sobre os relatórios.
Eu gostaria de fazer uma consulta quase exatamente o mesmo, exceto que só seleciona os ids do relatório com a data mais recente, entre estas 2 datas.
alguém pode ajudar? Eu não consigo colocar minha cabeça em torno de Max (data) consultas do tipo -. Tudo que eu voltar é uma contagem de todos os id e também a data max, em vez de apenas os ids a partir da data max
Obrigado,
Eu estive pensando, talvez, uma consulta SQL nested - você pode fazer isso? Posso encontrar referências no Google, mas não pode fazê-lo funcionar ... Algo semelhante a:
SELECT COUNT(table2.id)
FROM table2
INNER JOIN table1 ON table2.relazioneid = table1.id
WHERE table1.date > ? AND table1.date < ? AND
(
SELECT MAX(date)
FROM table1
WHERE date > ? AND date < ?
)
Não é possível chegar a esse trabalho, porém, e quando tento testá-lo em phpMyAdmin, ele me chuta para fora com um erro dizendo que o meu usuário não tem privilégios SELECT. Estranho, uma vez que este é um servidor de teste que eu estou conectado em como root.
Solução
Sem mais informações sobre a estrutura das tabelas, gostaria de sugerir que você tentar algo como isto:
SELECT t2.id
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.relation_id
WHERE t1.date BETWEEN ? AND ?
HAVING MAX(t1.date)
Eu não testei isso, mas deve apontar para uma direção que poderia ir com este problema. Os seus outros sugestão de usar uma subconsulta é válido e trabalho poderia algo como isto:
SELECT *
FROM table2 t2
WHERE t2.parent_id IN (
SELECT t1.relation_id
FROM table1 t1
WHERE t1.date BETWEEN ? AND ?
GROUP BY t1.relation_id
HAVING MAX(t1.date)
)
Ou em uma junção de uma tabela temporária:
SELECT *
FROM table2 t2
INNER JOIN (
SELECT t1.relation_id
FROM table1 t1
WHERE t1.date BETWEEN ? AND ?
GROUP BY t1.relation_id
HAVING MAX(t1.date)
) AS t1 ON t2.relation_id = t1.relation_id
Outras dicas
...WHERE table1.date BETWEEN'2009-01-01' AND '2009-01-02' ORDER BY table1.date LIMIT 10
você irá obter 10 primeiras linhas com as datas