我可以获得一些有关此查询的帮助。我会详细解释一下。为了方便起见,我将以HTML标签和属性为例。
我有3张桌子:
tagId
,tagName
)attId
,attName
)tagId
,attId
)我想选择属于所选标签的所有属性(以及有关属性的相关信息)(在标签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
提前致谢。
答案 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