如何比较表格并获得差异

时间:2013-04-08 11:20:46

标签: php mysql

比较我的两张桌子时遇到一些问题。通常我会展示我如何解决问题,但在这里我不知道该怎么做。通常,我在php中这样做。所以我从2个表中获取所有信息然后进行比较。但我想在MySQL中做到这一点。我希望你能提供帮助。

第一个表是我的交易表。这是人们在餐馆里使用卡片的地方。

第二张桌子是我的预订表。这是人们在餐厅预订的地方。

我想比较这些表,所以我可以得到那些没有使用过预订的人

交易mySQL

SELECT t.*, em.* FROM transactions as t
  left join exp_members as em on (t.cardid-10000000 = em.member_id) 
  left JOIN exp_member_data emd on em.member_id = emd.member_id ORDER BY t.created DESC

交易表。

Trans_ID     TransactionTime         Name            Restaurant 
1852         2013-04-08 12:45:21     Christian       La Canton
1851         2013-04-08 12:41:00     Zaz             Parken

预订mySQL

SELECT b.* from exp_menucard_booking as b;

预订表:

ID      BookingTime          Name            NumberOfPeople  Restaurant 
270     2013-04-09 14:45:00  Christian       2               La Canton
269     2013-04-08 12:17:00  Toby            4               La Raz

正如您所见,来自Booking表的Toby没有使用他的卡(交易表)。我怎么能让他离开我的桌子呢。

3 个答案:

答案 0 :(得分:0)

如果您想选择已预订的所有人(预订表中有条目)但在交易表中没有条目,您可以尝试此查询:

SELECT * 
FROM `Booking` B 
WHERE NOT EXISTS (
    SELECT * 
    FROM `Transaction` T 
    WHERE T.name = B.name
); 

顺便说一下,如果您使用一些User_ID代替name来识别这些人,那会更好

答案 1 :(得分:0)

这是您可以选择所有未使用预订的记录的方法。它被称为排除左连接或左排除连接。 http://www.magecorner.com/mysql-joins-explained/

我不确定这是否比WHERE NOT EXISTS更快,但考虑到它有子查询,我认为这更快。

SELECT emb.*
FROM   exp_menucard_booking emb
LEFT JOIN transactions      t
  ON (
    t.Name       = emb.Name AND
    t.Restaurant = emb.Restaurant
  )
WHERE t.Trans_ID IS NULL

答案 2 :(得分:0)

SELECT * FROM Booking WHERE NAME NOT IN (SELECT NAME FROM Transaction );