Tôi đã suy nghĩ lại và có lẽ cách tiếp cận này tốt hơn:
SELECT T1.id
FROM
(
select textures.id
from textures
WHERE textures.name LIKE '%texture1%'
UNION
select textures.id
from textures
join category_texture on category_texture.texture_id = textures.id
join categories on categories.id = category_texture.category_id
WHERE categories.name LIKE '%texture1%'
UNION
select textures.id
from textures
join tag_texture on tag_texture.texture_id = textures.id
join tags on tags.id = tag_texture.tag_id
WHERE tags.name LIKE '%texture1%'
UNION
select textures.id
from textures
join size_texture on size_texture.texture_id = textures.id
join sizes on sizes.id = size_texture.size_id
WHERE sizes.name LIKE '%texture1%'
) AS T1
JOIN
(
select textures.id
from textures
WHERE textures.name LIKE '%category2%'
UNION
select textures.id
from textures
join category_texture on category_texture.texture_id = textures.id
join categories on categories.id = category_texture.category_id
WHERE categories.name LIKE '%category2%'
UNION
select textures.id
from textures
join tag_texture on tag_texture.texture_id = textures.id
join tags on tags.id = tag_texture.tag_id
WHERE tags.name LIKE '%category2%'
UNION
select textures.id
from textures
join size_texture on size_texture.texture_id = textures.id
join sizes on sizes.id = size_texture.size_id
WHERE sizes.name LIKE '%category2%'
) AS T2
ON T1.id = T2.id
JOIN
(
select textures.id
from textures
WHERE textures.name LIKE '%tag3%'
UNION
select textures.id
from textures
join category_texture on category_texture.texture_id = textures.id
join categories on categories.id = category_texture.category_id
WHERE categories.name LIKE '%tag3%'
UNION
select textures.id
from textures
join tag_texture on tag_texture.texture_id = textures.id
join tags on tags.id = tag_texture.tag_id
WHERE tags.name LIKE '%tag3%'
UNION
select textures.id
from textures
join size_texture on size_texture.texture_id = textures.id
join sizes on sizes.id = size_texture.size_id
WHERE sizes.name LIKE '%tag3%'
) AS T3
ON T1.id = T3.id
Chỉ cần thêm / bớt JOIN...ON T1.id = Tn.id
các phần để phù hợp với các thông số của bạn.
Đây là một thủ thuật để hiển thị nó đang thực thi: http://sqlfiddle.com/#!9/ 9abe6 / 1