PDA

Показать полную графическую версию : [решено] Извлечь данные одним запросом


Strange_V
20-02-2008, 18:28
На самом деле запрос немного сложнее и содержит больше таблиц, но упирается все в такую конструкцию:
workers
id|name|position|
1| n1| 1|
2| n2| 2|

position
id|num|date |name|
1| 1|01/01/2008| p1|
2| 2|01/01/2008| p2|
3| 1|01/02/2008| p1n|

Запрос:
SELECT w.name, p.name, p.date
FROM workers w
LEFT JOIN position p ON w.position = p.num (and поле date максимальное)

Должен получить:
| n1| p1n|01/02/2008|
| n2| p2|01/01/2008|

В оригинале дата хранится в timestamp

Sham
20-02-2008, 19:00
(and поле date максимальное) »
ORDER BY date DESC LIMIT 2?

Strange_V
20-02-2008, 20:25
Число записей в workers как и повторяющихся (с разными датами) в position непостоянно, так не выйдет, к тому же хотелось бы иметь возможность сортировать так как будет удобно пользователю.

Приблизительно так выбираются данные в оригинале (возможно так будет проще объяснить)
SELECT tmc.inv_num,
p.name AS position,
w.fname,
w.lname,
p.tn,
m.name AS model
FROM tmc
LEFT JOIN doc_work dw ON tmc.id = dw.tmc and dw.frm = -1 (вот тут выбираются лишние строки, нужно только с самим большим значением dw.date)
LEFT JOIN workers w ON dw.rcpt = w.id
LEFT JOIN position p ON w.position = p.n
LEFT JOIN model m ON tmc.model = m.n and tmc.type = m.type
WHERE tmc.type = 1
ORDER BY 1

Sham
20-02-2008, 21:30
imo без вложенного запроса не обойтись...
... AND date=(SELECT MAX(date) FROM p WHERE ....)
и запрос лучше как-то логически перестроить, поскольку сложно будет оптимизировать...

Strange_V
20-02-2008, 23:18
Sham, спасибо, так и хотел, но не совсем получалось.
Тут (http://www.mysql.ru/docs/gruber/mg11.html) все ответы.




© OSzone.net 2001-2012