使用嵌套选择查询进行更新

时间:2015-12-01 09:27:31

标签: mysql sql

到目前为止,我已经在这个网站上进行了一些搜索并进行了实验,但我无法找到最后一步。 我有一个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语法错误。 我确定我差不多到了那里,但是我需要一些有用的人从这个树林的脖子上帮助我完成终点线。

非常感谢

1 个答案:

答案 0 :(得分:1)

在此查询中

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允许这样做,但它并不是真的。在您的情况下,您可以在MAX()函数的每一列上应用CONCAT()函数。

无论如何,下一个问题是,如果你更新你的方式,你会收到一个错误,说明you can't read and update from the same table at the same time之类的内容。您可以通过加入查询来阻止此操作,而不是在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;

请注意,我仍然懒得在你的列上应用上面提到的聚合函数:)