[英]Parent-child sql query with order by and limit
我有兩個這樣的表DOCUMENT和ATTRIBUTES
DOCUMENT(id)
, ATTRIBUTE(name, value, doc_fk)
。 我需要運行一個類似於“抽象查詢”的查詢
select top 100 documents
where $state='COMPLETED'
order by $creationDate
其中$state
和$creationDate
是兩個屬性。
請注意,限制是針對文檔而不是屬性,而排序和過濾器是針對兩個不同的屬性。 最終查詢應返回所有文檔屬性,而不僅僅是已過濾/排序的屬性。
我能夠通過一個非常復雜的查詢來編寫此代碼,並且正在尋找更好的選擇。 如果有用,我可以發布解決方案,但我不想指出可能錯誤的方向。
可以獲取少量的額外文檔,例如1000個而不是100個,並在內存中進行篩選/排序。 可以使限制不精確,例如74而不是所需的限制100,但不要太遠。
額外的“軟”要求:
預期的輸出是這樣的
DOC_ID ATTRIBUTE_NAME VALUE
123 state COMPLETED
123 creationDate 21/11/2012
123 userid someone
456 state COMPLETED
...
嗯,EAV設計的缺陷。
嘗試這個。
select
top 100
document.*
from document
inner join attribute astate on document.id = astate.doc_fk
and astate.name='state'
and astate.value = 'completed'
inner join attribute acreation on document.id = acreation.doc_fk
and acreation.name='creationdate'
order by cast(acreation.value as date)
但是,如果您堅持使用這種EAV結構,只會變得更加復雜。
(PS。MySQL不使用TOP,而是使用LIMIT)
SELECT doc_id, attr_name, attr_val, creationDate FROM
(
SELECT * FROM (
SELECT
doc.id as 'doc_id', attr.name as 'attr_name', null as 'attr_val', attr.value as 'creationDate'
FROM
ATTRIBUTE attr
LEFT JOIN
DOCUMENT doc ON attr.doc_fk = doc.id
WHERE
attr.name='creationDate'
ORDER BY creationDate desc;
) AS dt1
UNION ALL
SELECT * FROM(
SELECT
doc.id as 'doc_id', attr.name as 'attr_name', attr.value as 'attr_val', null as 'creationDate'
FROM
ATTRIBUTE attr
LEFT JOIN
DOCUMENT doc ON attr.doc_fk = doc.id;
) as dt2
) as dt0 GROUP BY doc_id ORDER by creationDate desc LIMIT 100;
派生表1(dt1)提供了所有日期屬性-允許按文檔的創建日期對結果進行排序。 派生表2為您提供了所有屬性。全部由“全部合並”在一起,使您可以按文檔分組,然后按創建日期排序。 希望這是正確的方向。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.