Mysql 联接查询的行为不符合预期
我正在处理一个行为不符合预期的查询,如果您能帮我指出正确的方向,我将不胜感激 桌子 我有三张中央桌子,包括以下几张Mysql 联接查询的行为不符合预期,mysql,sql,Mysql,Sql,我正在处理一个行为不符合预期的查询,如果您能帮我指出正确的方向,我将不胜感激 桌子 我有三张中央桌子,包括以下几张 table_categories - id (int) - name (varchar) table_events - id (int) - name (varchar) - created (date time) table_taxonomy - cat_id (id from table_categories) - event_id (id from table_event
table_categories
- id (int)
- name (varchar)
table_events
- id (int)
- name (varchar)
- created (date time)
table_taxonomy
- cat_id (id from table_categories)
- event_id (id from table_events)
- type (varchar in this example always 'category')
目标
统计每个类别中特定日期后创建的事件。结果应该是:
COUNT NAME ID
3 Rock 1
2 Punk 3
质疑
这就是我提出的问题。问题在于,结果并不关心创建日期,而是获取所有事件的创建时间和位置
SELECT COUNT(*) AS count,
table_categories.name,
table_categories.id
FROM table_taxonomy
INNER JOIN table_categories
ON table_categories.id = table_taxonomy.cat_id
LEFT JOIN table_events
ON table_events.id = table_taxonomy.events_id
WHERE table_taxonomy.type = 'category'
AND table_taxonomy.cat_id IN(2,3)
AND table_events.created > '2012-10-07 05:30:00'
GROUP BY (table_categories.name)
试试这个
SELECT c.ID, c.Name, COUNT(*)
FROM table_categories a
INNER JOIN table_taxonomy b
ON a.id = b.cat_id
INNER JOIN table_events c
ON b.event_ID = c.ID
WHERE c.created > 'dateHere'
-- AND ..... -- other conditions here
GROUP BY c.ID, c.Name
试试这个
SELECT c.ID, c.Name, COUNT(*)
FROM table_categories a
INNER JOIN table_taxonomy b
ON a.id = b.cat_id
INNER JOIN table_events c
ON b.event_ID = c.ID
WHERE c.created > 'dateHere'
-- AND ..... -- other conditions here
GROUP BY c.ID, c.Name
试试这一个,在比较日期时只需做些小改动:
SELECT COUNT(*) AS count,
table_categories.name,
table_categories.id
FROM table_taxonomy
INNER JOIN table_categories
ON table_categories.id = table_taxonomy.cat_id
LEFT JOIN table_events
ON table_events.id = table_taxonomy.events_id
WHERE table_taxonomy.type = 'category'
AND table_taxonomy.cat_id IN(2,3)
AND Date(table_events.created) > '2012-10-07 05:30:00'
GROUP BY (table_categories.name)
试试这一个,在比较日期时只需做些小改动:
SELECT COUNT(*) AS count,
table_categories.name,
table_categories.id
FROM table_taxonomy
INNER JOIN table_categories
ON table_categories.id = table_taxonomy.cat_id
LEFT JOIN table_events
ON table_events.id = table_taxonomy.events_id
WHERE table_taxonomy.type = 'category'
AND table_taxonomy.cat_id IN(2,3)
AND Date(table_events.created) > '2012-10-07 05:30:00'
GROUP BY (table_categories.name)
你能指出询问者的代码和你的代码之间的区别吗?@JanDvorak OP使用左连接,这与内部连接不同。你能指出询问者的代码和你的代码之间的区别吗?@JanDvorak OP使用左连接,这与内部连接不同。你从查询中得到了什么结果?请提供示例记录。您正在左连接表_事件,但WHERE条件会删除左连接将包含但内部连接不会包含的所有行。您从查询中得到了什么结果?请提供示例记录。您正在加入table_事件,但WHERE条件会删除左侧联接本应包含但内部联接不会包含的所有行。我很乐意提供帮助。。您可以将答案视为正确答案,以便其他人可以轻松解决他们的相同问题..:我很乐意帮忙。。您可以将答案视为正确答案,以便其他人可以轻松解决他们的相同问题..: