2016-10-12 187 views
0

history table包含我试图与participation table匹配的日期。如果日期不存在于participation table中,那么我希望记录被删除,以便我可以输入参与数据。但我有什么不行。下面是我用什么样的破败:MySQL左连接查询不起作用

MariaDB [sotp]> describe history; 
+--------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+------------------+------+-----+---------+----------------+ 
| historyid | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| amount  | float   | NO |  | NULL |    | 
| subsidy  | char(1)   | NO |  | NULL |    | 
| last_payment | date    | NO |  | NULL |    | 
| amount_paid | float   | NO |  | NULL |    | 
| balance  | float   | NO |  | NULL |    | 
| attend  | char(1)   | NO |  | N  |    | 
| atend_date | date    | NO |  | NULL |    | 
| groupid  | int(11) unsigned | NO |  | NULL |    | 
| clientid  | int(10) unsigned | NO | MUL | NULL |    | 
| memberid  | int(10) unsigned | NO | MUL | NULL |    | 
+--------------+------------------+------+-----+---------+----------------+ 

MariaDB [sotp]> select clientid, attend_date 
-> from history 
-> where memberid = "1" 
-> AND MONTH(attend_date) = "10" 
-> AND YEAR(attend_date) = "2016" 
-> AND attend_date <> "0000-00-00" 
-> ORDER BY attend_date ASC; 
+----------+-------------+ 
| clientid | attend_date | 
+----------+-------------+ 
|  3 | 2016-10-11 | 
|  1 | 2016-10-11 | 
|  7 | 2016-10-11 | 
|  2 | 2016-10-11 | 
|  4 | 2016-10-11 | 
|  5 | 2016-10-11 | 
|  8 | 2016-10-11 | 
|  9 | 2016-10-11 | 
+----------+-------------+ 

MariaDB [sotp]> describe participation; 
+-----------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-----------+------------------+------+-----+---------+----------------+ 
| partid | int(11)   | NO | PRI | NULL | auto_increment | 
| notes  | varchar(255)  | NO |  | NULL |    | 
| groupdate | date    | NO |  | NULL |    | 
| clientid | int(10) unsigned | NO | MUL | NULL |    | 
| memberid | int(10) unsigned | NO | MUL | NULL |    | 
+-----------+------------------+------+-----+---------+----------------+ 

MariaDB [sotp]> select clientid, groupdate 
-> from participation 
-> where memberid = "1" 
-> AND MONTH(groupdate) = "10" 
-> AND YEAR(groupdate) = "2016" 
-> AND groupdate <> "0000-00-00" 
-> ORDER BY groupdate ASC; 
+----------+------------+ 
| clientid | groupdate | 
+----------+------------+ 
|  2 | 2016-10-11 | 
|  4 | 2016-10-11 | 
+----------+------------+ 

而且我left join查询:

SELECT historyid, p.groupdate, h.attend_date, h.clientid, h.memberid 
FROM history AS h 
LEFT JOIN participation AS p ON p.groupdate = h.attend_date 
WHERE h.memberid = "1" 
AND MONTH(h.attend_date) = "10" 
AND YEAR(h.attend_date) = "2016" 
AND h.attend_date <> "0000-00-00" 
ORDER BY h.attend_date ASC; 
+-----------+------------+-------------+----------+----------+ 
| historyid | groupdate | attend_date | clientid | memberid | 
+-----------+------------+-------------+----------+----------+ 
|  58 | 2016-10-11 | 2016-10-11 |  3 |  1 | 
|  61 | 2016-10-11 | 2016-10-11 |  2 |  1 | 
|  59 | 2016-10-11 | 2016-10-11 |  1 |  1 | 
|  62 | 2016-10-11 | 2016-10-11 |  4 |  1 | 
|  60 | 2016-10-11 | 2016-10-11 |  7 |  1 | 
|  63 | 2016-10-11 | 2016-10-11 |  5 |  1 | 
|  61 | 2016-10-11 | 2016-10-11 |  2 |  1 | 
|  64 | 2016-10-11 | 2016-10-11 |  8 |  1 | 
|  62 | 2016-10-11 | 2016-10-11 |  4 |  1 | 
|  65 | 2016-10-11 | 2016-10-11 |  9 |  1 | 
|  63 | 2016-10-11 | 2016-10-11 |  5 |  1 | 
|  64 | 2016-10-11 | 2016-10-11 |  8 |  1 | 
|  65 | 2016-10-11 | 2016-10-11 |  9 |  1 | 
|  58 | 2016-10-11 | 2016-10-11 |  3 |  1 | 
|  59 | 2016-10-11 | 2016-10-11 |  1 |  1 | 
|  60 | 2016-10-11 | 2016-10-11 |  7 |  1 | 
+-----------+------------+-------------+----------+----------+ 

groupdate场应该是除了memberid 2和4 NULL加上它给出了数据的两倍。我究竟做错了什么?

此致敬礼。

UPDATE

kasparg要求:

MariaDB [sotp]> select * 
-> from participation; 
+--------+-----------------------------------------------+------------+----------+----------+ 
| partid | notes           | groupdate | clientid | memberid | 
+--------+-----------------------------------------------+------------+----------+----------+ 
| 824 | aaaaaaaaaaaaaaaaaaaaaazzzzzzzzzzzzzzzzzzzzzzz | 2016-01-26 |  3 |  1 | 
| 825 | lol hahaha and stuff       | 2016-01-26 |  4 |  1 | 
| 826 | aaaaaaaaaaaaaaaaaaaaaa      | 2016-01-26 |  2 |  1 | 
| 827 | zzzzzzzzzzzzzzaaaaaaaaaaaaaaaaaa    | 2016-01-26 |  1 |  1 | 
| 828 | llllllllllllllllllllllllllllllllllll   | 2016-01-28 |  3 |  1 | 
| 829 | bbbbbbbbbbbbbbbbbbb       | 2016-01-28 |  1 |  1 | 
| 830 | Absent          | 2016-01-28 |  4 |  1 | 
| 831 | Absent          | 2016-01-28 |  2 |  1 | 
| 832 | llllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk   | 2016-01-29 |  5 |  1 | 
| 833 | xxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzz    | 2016-01-29 |  4 |  1 | 
| 834 | xxxxxxxxxxxxxxxxxxxxxxxx      | 2016-01-29 |  2 |  1 | 
| 835 | ccccccccccccccccccccccc      | 2016-01-29 |  1 |  1 | 
| 836 | llllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk   | 2016-01-29 |  3 |  1 | 
| 1063 | zzzzzzzzzzzzzzzzzzzzzzzzzzzz     | 2016-01-30 |  3 |  1 | 
| 1064 | ddddddddddddddddddddddddd      | 2016-01-30 |  1 |  1 | 
| 1065 | No entry made.        | 2016-01-30 |  4 |  1 | 
| 1066 | No entry made.        | 2016-01-30 |  2 |  1 | 
| 1075 | 2016-02-26: car wreck       | 2016-10-11 |  2 |  1 | 
| 1076 | 2016-02-26: broken legs      | 2016-10-11 |  4 |  1 | 
+--------+-----------------------------------------------+------------+----------+----------+ 

UPDATE

MariaDB [sotp]> SELECT historyid, p.groupdate, h.attend_date, p.clientid, h.clientid, h.memberid 
-> FROM history AS h 
-> LEFT JOIN participation AS p ON p.groupdate = h.attend_date and p.clientid = h.clientid 
-> WHERE h.memberid = "1" 
-> AND h.clientid = "1" 
-> AND MONTH(h.attend_date) = "10" 
-> AND YEAR(h.attend_date) = "2016" 
-> AND h.attend_date <> "0000-00-00" 
-> AND p.groupdate = "NULL" 
-> ORDER BY h.attend_date ASC; 
Empty set, 1 warning (0.00 sec) 

我硬编码h.clientid = "1",仍然什么也得不到。并且该记录应为groupdate返回一个NULL值。

+0

可以显示什么是参与表里面? SELECT * FROM参与限制10; – kasparg

回答

0

如果我正确理解你,你想获得参与日期缺失的记录。添加附加标准WHERE子句:AND p.groupdate IS NULL

另外请注意,您只在groupdate加盟参与,也加入它的clientid,就像这样:LEFT JOIN participation AS p ON p.groupdate = h.attend_date and p.clientid = h.clientid

+0

您对我的查询的评估是正确的。请参阅我的更新。你给我看的东西看起来不错。所有的查询看起来都是对的......对我来说。但它每次都失败。 – Landslyde

+0

对不起。我对'php'页面所做的更改进行了更改,但仍未提取NULL记录。至少可以说这令人费解。 – Landslyde

+0

在您发布的数据中,您在p.memberid = 1上进行过滤,但不在您的查询中进行过滤。它可能会影响你的结果。 –