2016-10-12 3 views
0

history table содержит даты, которые я пытаюсь сопоставить с participation table. Если дата не существует в participation table, я хочу, чтобы запись была удалена, поэтому я могу ввести данные об участии. Но то, что у меня есть, не работает. Вот краткое изложение того, что я использую:MySQL Left Join Запрос не работает

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 должно быть NULLmemberid для 2 и 4, за исключением Кроме того, он дает данные дважды. Что я делаю не так?

С уважением.

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" и до сих пор ничего не получают. И эта запись должна вернуть значение NULL для groupdate.

+0

вы можете показать, что находится внутри таблицы участия? ВЫБЕРИТЕ * ОТ Предела участия 10; – kasparg

ответ

0

Если вы правильно поняли, вы хотите получить регистрацию, в которой отсутствует дата участия. Добавить дополнительные критерии в предложении WHERE: AND p.groupdate IS NULL

Кроме того, обратите внимание, что вы присоединяетесь участие только groupdate, присоединиться к нему и на идентификатору клиента, как это: 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, но не в вашем запросе. Это может повлиять на ваши результаты. –

Смежные вопросы