【问题标题】:Merging SQL Records合并 SQL 记录
【发布时间】:2011-07-29 14:09:34
【问题描述】:

嘿,我不确定这是不是问这个问题的正确地方,但我的脚本遇到了问题。我正在尝试使用 PHP 进行一些数据库合并,一次合并。我正在做的是获取一本书的所有唯一标题的列表,然后通过这些标题查找具有该标题的书籍并按类型分组,然后通过该结果查找具有该唯一标题和类型的书籍,重复该过程版权和出版商。主要问题是mysql服务器超时需要很长时间。有没有更好的方法来做到这一点,可能使用 SQL?

合并的一个例子是这样的:

INSERT INTO books (1, 'Some Book', 'Penguin Publishing', '2005', 1);
INSERT INTO books (2, 'Some Book', 'Penguin Publishing', '2005', 1);
INSERT INTO books (3, 'Some Book 2', 'Penguin Publishing', '2005', 1);
INSERT INTO books (4, 'Some Book 2', 'Lion Publishing', '2005', 1);
INSERT INTO books (5, 'Some Book 2', 'Penguin Publishing', '2005', 2);
INSERT INTO books (6, 'Some Book 2', 'Penguin Publishing', '2005', 2);
INSERT INTO books (7, 'Somebody', 'Lion Publishing', '2005', 1);
INSERT INTO books (8, 'Somebody', 'Lion Publishing', '2007', 1);
INSERT INTO books (9, 'Somebody', 'Penguin Publishing', '2005', 1);

ID 的 1 和 2 应该加入,因为他们有 1) 相同的标题 2) 相同的 material_type_id 3) 相同的版权和 4) 相同的出版商。

有什么方法可以使用 PURE SQL 或次要 PHP 来实现这一点?

这是我的数据结构:

CREATE TABLE books (
  id int(11) NOT NULL AUTO_INCREMENT,
  title varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  publisher varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  copyright varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  material_type_id int(11) DEFAULT NULL
  PRIMARY KEY (id),
  FULLTEXT KEY title (title)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

编辑 我想我忘了提一些非常重要的事情。我不能只使用 GROUP 查询,因为我需要使用 id。我有另一个名为“项目”的表,其中包含字段 book_id。如果我只是对记录进行分组,我最终会得到孤立的项目。我需要的是一种分解订单查询的方法,所以我最终得到这样的结果:

id | title | publisher | copyright | material_type_id
-----------------------------------------------------
1  'Some Book' 'Penguin Publishing' '2005' 1
2  'Some Book' 'Penguin Publishing' '2005' 1
-----------------------------------------------------
5  'Some Book 2' 'Penguin Publishing' '2005' 2
6  'Some Book 2' 'Penguin Publishing' '2005' 2
-----------------------------------------------------
3  'Some Book 2' 'Penguin Publishing' '2005' 1
-----------------------------------------------------

因为我可以在第一组上运行这样的查询:

UPDATE items SET book_id = 1 WHERE book_id IN (1, 2)

我希望这是有道理的。我真的很难解释。感谢您的帮助和耐心。

【问题讨论】:

  • 那么您只是想删除重复的条目(所有字段都相同)吗?我记得我的一位老师总是说尽可能让数据库做繁重的工作,所以我会推荐直接 sql(如果可能的话)。
  • 您需要发布源表结构以供任何人回答如何在 SQL 中执行此操作。

标签: php mysql merge


【解决方案1】:

在给定重复规则的情况下,此查询保留除一份之外的所有图书副本(带有最小 ID)。

DELETE FROM A
using books A
join (select title,publisher,material_type_id,copyright, MIN(id) keep
    from books
    group by title,publisher,material_type_id,copyright
    having count(*) > 1) B
    on A.title=B.title
       and A.publisher=B.publisher
       and A.material_type_id=B.material_type_id
       and A.copyright=B.copyright
       and A.id <> B.keep;

之前运行上面,先移动项目记录(未正式测试)

UPDATE items
join books A on A.id = items.book_id
join (select title,publisher,material_type_id,copyright, MIN(id) keep
    from books
    group by title,publisher,material_type_id,copyright
    having count(*) > 1) B
    on A.title=B.title
       and A.publisher=B.publisher
       and A.material_type_id=B.material_type_id
       and A.copyright=B.copyright
       and A.id <> B.keep
set items.book_id = B.keep

【讨论】:

  • 这个解决方案的问题是我所有的item 记录都被孤立了
  • 你是我的救世主!!!!第二个代码块完全符合我的要求。现在我很想清理第一块代码,但我收到以下错误:[Err] 1064 - You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“where not ID in ( select MIN(id) from books group by title, mater”附近使用正确的语法
  • @LordZardeck / TSQL 显示,需要删除
  • 现在我明白了:[Err] 1093 - 您不能在 FROM 子句中指定目标表 'books' 进行更新
  • @LordZardeck / 启动 MySQL 检查语法并进行测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2012-10-16
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多