2

例如,我们有这三个表:

术语关系

╔═════════╦═════════╗
║ post_id ║ term_id ║
╠═════════╬═════════╣
║       1 ║       1 ║
║       1 ║       2 ║
║       1 ║       3 ║
╚═════════╩═════════╝

术语分类

╔════╦═════════╦══════════╗
║ id ║ term_id ║ taxonomy ║
╠════╬═════════╬══════════╣
║  1 ║       1 ║ categ    ║
║  2 ║       2 ║ categ    ║
║  3 ║       3 ║ tag      ║
║  4 ║       3 ║ categ    ║
║  5 ║       4 ║ categ    ║
║  6 ║       5 ║ tag      ║
╚════╩═════════╩══════════╝

条款

╔════╦════════╦════════╗
║ id ║  name  ║  slug  ║
╠════╬════════╬════════╣
║  1 ║ samsung║ samsung║
║  2 ║ nokia  ║ nokia  ║
║  3 ║ opera  ║ opera  ║
║  4 ║ chrome ║ chrome ║
║  5 ║ webkit ║ webkit ║
╚════╩════════╩════════╝

什么时候terms_relation.post_id = 1,我如何选择所有基于intermstaxonomy行?categterms_taxonomyterm_id

所以它必须得到:samsungnokia(不是opera因为它是一个标签)。

这是我目前的尝试,不幸的是我不明白我的查询有什么问题:

select terms.name from terms_taxonomy 
join terms_relation 
on terms_relation.post_id = 1
join terms
on terms_taxonomy.term_id = terms.id
where taxonomy = "categ"

上面查询的不需要的输出:

+---------+
| name    |
+---------+
| samsung |
| nokia   |
| opera   |
| chrome  |
| samsung |
| nokia   |
| opera   |
| chrome  |
| samsung |
| nokia   |
| opera   |
| chrome  |
| samsung |
| nokia   |
| opera   |
| chrome  |
| samsung |
| nokia   |
| opera   |
| chrome  |
| samsung |
| nokia   |
| opera   |
| chrome  |
+---------+
4

2 回答 2

1

您可能应该只是将条件移动到JOIN. 此外,post_id在 WHERE 中移动条件似乎更合乎逻辑:

SELECT t.name 
FROM terms_relation tr
JOIN terms_taxonomy tt ON tr.term_id = tt.term_id AND tt.taxonomy = "categ"
JOIN terms t ON tr.term_id = tt.id
WHERE tr.post_id = 1

编辑我再次重读了您的问题,但无法真正弄清楚关系是如何定义的,我假设了这些连接条件:

  • terms_taxonomy.term_id = terms_relation.term_id
  • terms.id = terms_taxonomy.term_id
于 2012-05-13T11:28:28.007 回答
0

这是一个没有连接的版本:

SELECT name FROM terms WHERE id IN 
(SELECT id FROM terms_taxonomy,terms_relation,terms
 WHERE terms_relation.post_id = 1 
 AND terms_taxonomy.taxonomy = "categ" 
 AND terms.id = terms_taxonomy.term_id);
于 2012-05-13T11:23:01.657 回答