组合Tables / Join Query MySql

时间:2013-10-28 19:20:08

标签: mysql sql join

我遇到了这个问题,我无法解决。我需要帮助加入表格。

我有4个表(客户,产品,状态和报价)。

我想根据客户ID从这些表中读取。

在前3个表中,针对客户ID的记录数为1,但商品表可能包含多个客户行。

我想阅读每个客户的商品表中的最新一行。我无法对这种情况进行查询。

例如

Customer have columns (cID, Name, Surname)
STATUS (sID, cID, Status, Sdate)
ADDRESS (adID, cID, Addetail)
Offer (ID, cID, offer, offDate)

这是我的查询,但无效:

SELECT c.ID, 
c.NAME, 
c.SURNAME, 
st.ID, 
st.Status, 
st.Sdate
ad.Addetial,
off.OffDATE
FROM customer c, address ad, status st, offer of

WHERE 
c.ID=ad.cID 
AND c.ID=st.cID 
AND c.ID = off.cID
.. 

我很困惑如何将商品表中的选择限制为一行。因为如果我把c.ID = off.cID,那么它将返回我不想要的所有优惠。

PS:我知道有类似的问题,但我根据自己的情况无法映射。 使用Max,只返回一行(即使有很多客户)。

2 个答案:

答案 0 :(得分:0)

试试这个

SELECT c.ID, 
c.NAME, 
c.SURNAME, 
st.ID, 
st.Status, 
st.Sdate
ad.Addetial,
off.OffDATE
FROM customer c   
WHERE 
INNER JOIN  address ad ON c.ID=ad.cID 
INNER JOIN  status st  ON AND c.ID=st.cID 
INNER JOIN (SELECT *,MAX(id) AS `max` FROM offer GROUP BY  id ,cID) off
ON c.ID = off.cID

我使用子查询(SELECT *,MAX(id) AS max FROM offer GROUP BY id ,cID)来获取最新的客户优惠子查询只执行一次以获得所需的最新数据集

答案 1 :(得分:0)

您想要groupwise maximum,可以通过将offer表加入其自身的分组版本来获取:

SELECT c.ID,
       c.NAME, 
       c.SURNAME, 
       st.ID, 
       st.Status, 
       st.Sdate
       ad.Addetial,
       off.OffDATE
FROM   customer c
  JOIN address  ad ON ad.cID = c.ID
  JOIN status   st ON st.cID = c.ID
  JOIN (offer  off NATURAL JOIN (
         SELECT   cID, MAX(OffDATE) OffDATE
         FROM     offer
         GROUP BY cID
       ) t) ON off.cID = c.ID