MySQL查询建议请求

时间:2011-10-13 10:56:05

标签: mysql join

我可以获得一些有关此查询的帮助。我会详细解释一下。为了方便起见,我将以HTML标签和属性为例。

我有3张桌子:

  • tbl1 - 包含所有HTML标记(tagIdtagName
  • tbl2 - 包含可能出现在的所有可用属性 标签(attIdattName
  • tbl3 - 是tbl1和tbl2的映射表(tagIdattId

我想选择属于所选标签的所有属性(以及有关属性的相关信息)(在标签ID 4下面的示例中)和标签的ID。

以下是我想从查询中获得的一个示例:

attId  tagId   attName  
50     4       The name of the attribute with id 50
89     4       The name of the attribute with id 89
114    4       The name of the attribute with id 114

以下是我所做的查询,但我相信有更好的方法。

SELECT tbl2.*, tbl3.tagId
FROM tbl2 JOIN tbl3 
WHERE tbl3.attId IN (
     SELECT tbl3.attId FROM tbl3 where tbl3.tagId=4
     )
AND tbl3.attIdd = tbl2.attId
GROUP BY tbl3.attId

提前致谢。

3 个答案:

答案 0 :(得分:3)

第1期
您正在进行交叉连接,稍后通过在where子句中添加过滤器来缩减为内连接 这是使用隐式连接语法时的旧方法 在大多数SQL方言(但不是MySQL)上,这会产生错误 如果没有ON条款,请勿进行加入。
如果要进行交叉连接,请使用以下语法:select * from a cross join b

第2期
实际上不需要子选择,你可以在where子句中进行测试。

SELECT tbl2.*, tbl3.tagId 
FROM tbl2 
INNER JOIN tbl3 ON (tbl3.attIdd = tbl2.attId)
WHERE tbl3.tagId = 4 
GROUP BY tbl3.attId 

第3a期
您正在tbl3.ATTid上执行分组,在此上下文中与tbl2.attid 上的分组相同(因为ON (tbl3.attIdd = tbl2.attId)子句) <登记/> 后者更有意义,因为你正在做select tbl2.*,而不是select tbl3.*

问题3b
如果 attId不是tbl2的主键或唯一键,则查询结果将是不确定的。
这意味着查询将从具有相同attID的可能行列表中随机选择一行。如果您不希望这样,则必须包含一个having子句,该子句将根据某些条件选择一行。

示例

/*selects the most recent row per attID, instead of a random one*/
SELECT tbl2.*, tbl3.tagId 
FROM tbl2 
INNER JOIN tbl3 ON (tbl3.attIdd = tbl2.attId)
WHERE tbl3.tagId = 4 
GROUP BY tbl2.attId 
HAVING tbl2.dateadded = MAX(tabl2.dateadded) 

答案 1 :(得分:1)

你可以这样做。

SELECT tbl2.*, tbl3.tagId
FROM tbl2 JOIN tbl3 
ON tbl3.attId = tbl2.attId
WHERE tbl2.tagId = <selected id>
GROUP BY tbl3.attId

答案 2 :(得分:-1)

SELECT  tbl2.attId, tbl1.tagId, tbl2.attName FROM tbl3, tbl1, tbl2 
   WHERE tbl1.tagId = tbl3.tagId AND tbl2.attId = tbl3.attId AND tbl3.tagId = 4