2017-01-09 110 views
1

我有三个表,我想从table1中选择DISTINCT *,并从table2中选择vid在table3中可用的表中的cat。MySql-从三个表中选择DISTINCT值

表1

id  fname  area  price 

1  ABC   Mall R  1500 
2  ABd   Mall a  1400 
3  ABe   Mall f  1200 
4  ABt   Mall b  1000 

表2

id  catid  cat 

1   2   xy 
2   2   yz 
3   1   yxx 
4   4   ytt 
5   3   xy 

表3

id  vid 

1   2 
2   1 
3   4 

到目前为止,我曾尝试为

SELECT * FROM Table1,Table2,Table3 
WHERE 
Table1.id=Table2.catid AND 
Table1.id=Table3.vid; 

输出我得到

id  fname  area  price  cat 

1  ABC   Mall R  1500  yxx 
2  ABd   Mall a  1400  xy 
2  ABd   Mall a  1400  yz 
4  ABt   Mall b  1000  ytt 

所需的输出

id  fname  area  price  cat 

1  ABC   Mall R  1500  yxx 
2  ABd   Mall a  1400  xy 
4  ABt   Mall b  1000  ytt 

我想选择ID 2的细节只是一次不要紧,它需要从猫表2 “xy或yz”。

感谢....

+0

你可以使用一个最大或最小的猫或VID,但似乎键是不是真的强大到这有效地 – SaggingRufus

+1

你可以随时'GROUP BY Table1.id' ...也许 – apokryfos

+4

今天提示:切换到现代,明确的'JOIN'语法。易于编写(没有错误),更易于阅读和维护,并且在需要时更容易转换为外部联接。 – jarlh

回答

4

现在用现代的,明确的JOIN语法和表的别名。

子查询仅返回每个catid的最大cat值。

SELECT t1.id, t1.fname, t1.area, t1.price, t2.cat 
FROM Table1 t1 
JOIN (select catid, max(cat) cat from Table2 group by catid) t2 ON t1.id = t2.catid 
JOIN Table3 t3 ON t1.id = t3.vid 

我不明白为什么在查询中包含Table3。您可能可以删除最后一个JOIN并仍然获得预期的结果。

0

这是一个非常简单的,你可以得到你的愿望输出没有连接查询。它更聪明地使用简单的查询,而不是使用连接查询。因为它更快,而且不复杂。如果你不需要串行智能ID,你可以忽略order by t1.id。如果不需要,也可以忽略order by。希望它能帮助你。

SELECT t1.id,t1.fname,t1.area,t1.price,t2.cat 
FROM table1 as t1, table2 as t2, table3 as t3 
WHERE t1.id = t2.catid and t2.catid = t3.vid 
group by t1.id order by t1.id