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条件会删除左侧联接本应包含但内部联接不会包含的所有行。我很乐意提供帮助。。您可以将答案视为正确答案,以便其他人可以轻松解决他们的相同问题..:我很乐意帮忙。。您可以将答案视为正确答案,以便其他人可以轻松解决他们的相同问题..: