gpt4 book ai didi

mysql - 使用嵌套选择查询更新

转载 作者:行者123 更新时间:2023-11-28 23:43:13 25 4
gpt4 key购买 nike

到目前为止,我已经在此站点上进行了一些搜索并进行了试验,但我找不到最后一步。我有一个 track_id 和 track_data 的 SQL 表。我希望后者通过各种连接从其他表中提取的文本进行更新。到目前为止,我可以让它显示我在测试表中的一个 track_id 的数据。但是我想用我可以为每个 track_id 显示的内容更新 track_data。

    track_id        track_data
4560
4561

我的选择查询是

    SELECT * FROM (
SELECT tdd.track_id, CONCAT(t.track_name, ' ', t.track_description, ' ', t.keywords, ' ', tc.library_name, ' ', tc.label_name, ' ', tc.album_reference, ' ',
GROUP_CONCAT(category_name))
FROM track_data AS tdd
JOIN tracks t
ON tdd.track_id = t.track_id
JOIN tracks_cache tc
ON tc.track_id = t.track_id
JOIN categories_to_track ct
ON t.track_id = ct.track_id
JOIN categories c
ON c.category_id = ct.category_id
) AS trck

哪些输出

    track_id        track_data
4560 text text text from other tables categories etc

我想用我在上面看到的内容更新 track_data,也想更新那个表中的每个 track_id。

如果我尝试在开始时添加 SELECT trck.track_id,它只会显示一个轨道 ID,而不是所有轨道 ID。如果我尝试用

包裹它
   UPDATE track_data SET track_data = (
SELECT CONCAT(t.track_name, ' ', t.track_description, ' ', t.keywords, ' ', tc.library_name, ' ', tc.label_name, ' ', tc.album_reference, ' ',
GROUP_CONCAT(category_name))
FROM testtrackdata AS tdd
JOIN tracks t
ON tdd.track_id = t.track_id
JOIN tracks_cache tc
ON tc.track_id = t.track_id
JOIN categories_to_track ct
ON t.track_id = ct.track_id
JOIN categories c
ON c.category_id = ct.category_id
) AS trck
WHERE track_data.track_id = trck.track_id

和其他变体,我只是遇到无法解决的 SQL 语法错误。我确定我快到了,但我需要这个树林脖子上的一些乐于助人的人来帮助我越过终点线。

非常感谢

最佳答案

在这个查询中

SELECT * FROM (
SELECT tdd.track_id, CONCAT(t.track_name, ' ', t.track_description, ' ', t.keywords, ' ', tc.library_name, ' ', tc.label_name, ' ', tc.album_reference, ' ',
GROUP_CONCAT(category_name))
FROM track_data AS tdd
JOIN tracks t
ON tdd.track_id = t.track_id
JOIN tracks_cache tc
ON tc.track_id = t.track_id
JOIN categories_to_track ct
ON t.track_id = ct.track_id
JOIN categories c
ON c.category_id = ct.category_id
) AS trck

不需要外部查询,您可以在那里分配一个别名。此外,如果您想要每个 track_id 的数据,您还缺少 GROUP BY。所以你的查询变成这样:

SELECT tdd.track_id, CONCAT(t.track_name, ' ',    t.track_description, ' ', t.keywords, ' ', tc.library_name, ' ', tc.label_name, ' ', tc.album_reference, ' ', 
GROUP_CONCAT(category_name)) AS track_data
FROM track_data AS tdd
JOIN tracks t
ON tdd.track_id = t.track_id
JOIN tracks_cache tc
ON tc.track_id = t.track_id
JOIN categories_to_track ct
ON t.track_id = ct.track_id
JOIN categories c
ON c.category_id = ct.category_id
GROUP BY tdd.track_id

但请注意,这并不完全正确。使用 GROUP BY 的规则是,您在 SELECT 子句中使用的每一列都应该在 GROUP BY 子句或聚合函数中应该应用在它上面。原因是,每个组的行有点折叠,当您不应用聚合函数时,会显示每个组的随机行。 MySQL 允许这样做,但实际上并不正确。在您的情况下,您可以在 CONCAT() 函数的每一列上应用 MAX() 函数。

无论如何,下一个问题是,如果您更新您执行此操作的方式,您将收到一个错误,指出类似您无法同时从同一个表读取和更新。您可以通过加入您的查询而不是在 SET 部分中执行它来防止这种情况。这样 MySQL 在实际更新之前会生成一个临时表。

UPDATE trackdata t 
JOIN (
SELECT tdd.track_id, CONCAT(t.track_name, ' ', t.track_description, ' ', t.keywords, ' ', tc.library_name, ' ', tc.label_name, ' ', tc.album_reference, ' ',
GROUP_CONCAT(category_name)) AS track_data
FROM track_data AS tdd
JOIN tracks t
ON tdd.track_id = t.track_id
JOIN tracks_cache tc
ON tc.track_id = t.track_id
JOIN categories_to_track ct
ON t.track_id = ct.track_id
JOIN categories c
ON c.category_id = ct.category_id
GROUP BY tdd.track_id
) sq ON t.track_id = sq.track_id
SET t.track_data = sq.track_data;

请注意,尽管我仍然懒得在您的列上应用上述聚合函数 :)

关于mysql - 使用嵌套选择查询更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34016855/

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