到目前为止,我已经在这个网站上进行了一些搜索并进行了实验,但我无法找到最后一步。 我有一个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语法错误。 我确定我差不多到了那里,但是我需要一些有用的人从这个树林的脖子上帮助我完成终点线。
非常感谢
答案 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;
请注意,我仍然懒得在你的列上应用上面提到的聚合函数:)