gpt4 book ai didi

php - 合并 SQL 记录

转载 作者:行者123 更新时间:2023-11-29 00:57:06 24 4
gpt4 key购买 nike

嘿,我不确定在这里问这个问题是否合适,但我的脚本有问题。我正在尝试用 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。我有另一个名为“Items”的表,其中包含字段 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)

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

最佳答案

在给定重复规则的情况下,此查询会保留该书的所有副本(具有最小 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

关于php - 合并 SQL 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5545915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com