如何处理mysql中的错误数据?

时间:2014-04-04 21:11:48

标签: mysql

我想要合并三个表。

我有以下查询要运行:

DROP TABLE
IF EXISTS testgiver.smart_curmonth_downs;

CREATE TABLE testgiver.smart_curmonth_downs


SELECT
ldap_karen.uid,
ldap_karen.supemail,
ldap_karen.regionname,
smart_curmonth_downs_raw.username,
smart_curmonth_downs_raw.email,
smart_curmonth_downs_raw.publisher,
smart_curmonth_downs_raw.itemtitle,
smart_items.`Owner`
FROM
smart_curmonth_downs_raw
INNER JOIN ldap_karen ON smart_curmonth_downs_raw.username = ldap_karen.uid
INNER JOIN smart_items ON smart_curmonth_downs_raw.itemtitle = smart_items.Title 

我想知道如何创建连接,同时使用表smart_curmonth_downs_raw中的行始终保持一对一的关系。

例如,如果ldap_karen中没有uid我有问题。然后我发现的最后一个问题是我们的CMS允许重复的项目标题。因此,如果我运行我的查询,我会获得更多行,因为它为每个项目标题创建一行。例如,是否有办法只捕获smart_items中的最后一个项目标题。我真的想保持相同的行数 - 而且我无法控制其他表的完整性问题。

smart_curmonth_downs_raw表是原始下载信息(下载统计信息),karen表添加唯一用户信息,smart_items表添加唯一项(下载)信息。它们都很重要。如果用户进行了下载但被淘汰了karen表,我希望看到用户信息的NULL,如果smart_items中有多个项目具有相同的名称,那么我希望看到最高的项目ID。

1 个答案:

答案 0 :(得分:0)

听起来smart_curmonth_downs_rawldap_karen之间的关系是可选的,这意味着你想要使用第一个表中所有行的LEFT JOIN,如果右表是不存在,使用NULL作为右表的列值。

就smart_items表中的最后一项而言,您可以使用此查询。

SELECT title, MAX(id) AS max_id
FROM smart_items
GROUP BY title;

将该查询与其他逻辑相结合,尝试将此查询作为解决方案。

SELECT COALESCE(ldap_karen.uid, 'Unknown') AS uid,
       COALESCE(ldap_karen.supemail, 'Unknown') AS supemail,
       COALESCE(ldap_karen.regionname, 'Unknown') AS regionname,
       smart_curmonth_downs_raw.username,
       smart_curmonth_downs_raw.email,
       smart_curmonth_downs_raw.publisher,
       smart_curmonth_downs_raw.itemtitle,
       smart_items.`Owner`
FROM smart_curmonth_downs_raw
INNER JOIN (SELECT title, MAX(id) AS max_id
            FROM smart_items
            GROUP BY title) AS most_recent
  ON smart_curmonth_downs_raw.itemtitle = most_recent.Title;      
INNER JOIN smart_items 
  ON most_recent.max_id = smart_items.id
LEFT JOIN ldap_karen 
  ON smart_curmonth_downs_raw.username = ldap_karen.uid;