我有一個系統,它允許我處理書籍和研究人員在他們查找書籍時可以執行的操作。mysql,加入和排除匹配
數據庫是mysql,我有兩個主表BOOKS
和RESEARCHES
。
BOOKS(id *int*, author *string*, title *string*, price *string*, tags *set('sci-fi', 'literature', 'theatre', 'drama', 'romance', 'recent', ...)*, ...)
RESEARCHES is (researches_id, price_max, author, ...)
當我在我的數據庫中添加一本書時,我想要得到與這本新書相匹配的研究。 由於人們可以在他們的研究中使用多個標籤(超過30個),我決定創建另一個表格,並且不要使用RESEARCHES
中的標籤列,因爲我認爲SET
上沒有索引,因此SET
, 列,所以我的數據庫不能快速處理我的請求。
RESEARCHES_TAGS(id, researches_id, tag).
如果我通過PK迪克添加了一本書,與標籤「科幻」,「電視劇」,我想有標籤的研究作爲NULL
或標籤在(「科幻」, '戲劇'),並排除 研究與其他標籤。
所以我做以下請求:
SELECT * FROM RESEARCHES
LEFT JOIN RESEARCHES_TAGS ON RESEARCHES.researches_id = RESEARCHES_TAGS.researches_id AND RESEARCHES_TAG.tag IN ('literature', 'theatre', 'romance', ...)
WHERE RESEARCHES_TAGS.tag IS NULL
注意,指定的標籤數組不包含標籤「科幻」,「戲劇」。
我的問題是:有沒有更好的解決方案?
您改寫問題的方式非常好,符合我的顧慮。 我實際上有越來越多的標準列表,我無法爲每個標準創建列。 那麼,是的,如何以比「LEFT JOIN j WHERE j.id IS NULL」語句更恰當的方式來獲得Will,Jane和Mark的研究? – marc 2011-02-02 08:51:28