gpt4 book ai didi

mysql - 如何在子查询中使用 select 的值?

转载 作者:行者123 更新时间:2023-11-30 01:02:34 26 4
gpt4 key购买 nike

我正在尝试加入选择语句。但是子查询选择返回太多行,使其变得非常慢 - 因为我无法将第一个选择的 ID 获取到子查询中。

错误是:

Error Code: 1054. Unknown column 'ritzau_data.News.id' in 'where clause'

如何在连接内的第一个选择中获取此 id?我在 MSSQL 中做了类似的东西 - 效果很好。我还将粘贴工作的 MSSQL 代码。

MySQL代码(不工作):

select News.id as newsid, header as title, content as contents, created as published_time, 2883 as drupalid, isins, categories, NewsTypes.npName from ritzau_data.News,
(
select idNews, group_concat(isin separator ', ') as isins
from ritzau_data.NewsIsin
where idNews = ritzau_data.News.id
group by idNews

) as isins,
(
select idNews, group_concat(distinct Category separator ', ') as categories
from ritzau_data.NewsTags

inner join ritzau_data.TagsCategoriesMap on NewsTags.idTag = TagsCategoriesMap.idTags
inner join ritzau_data.Categories on TagsCategoriesMap.idCategories = Categories.id
where idNews = ritzau_data.News.id
group by idNews
) as categories

left join ritzau_data.NewsTypes on News.idType = NewsTypes.id
inner join ritzau_data.NewsReceivers on News.id = NewsReceivers.idNews
where ritzau_data.News.id > 100 and idReceiver = 3
order by News.id
limit 100;

MSSQLCode(工作):

SELECT TOP 1000 news.id AS newsid, 
cast(title as varchar(256)) AS title, cast(contents as text)AS contents, published_time, users.drupalid,
cast (STUFF(
(
SELECT ',' + isin
FROM news_instruments t1
left join instruments t2 on t1.instrument_id = t2.id
where news_id = news.id
FOR XML PATH('')
),1,1,''
) as text) AS isins,
cast(STUFF(
(
SELECT ',' + t2.name
FROM news_categories t1
left join categories t2 on t1.category_id = t2.id
where news_id = news.id
FOR XML PATH('')
),1,1,''
) as text) AS categories
from news
left join users on news.locked_userid = users.id
where news.id > @offsetid

第一个查询 - 它可以工作,但速度非常慢

select News.id as newsid, header as title, content as contents, created as published_time, 2883 as drupalid, isins, categories, NewsTypes.npName from ritzau_data.News    
left join ritzau_data.NewsTypes on News.idType = NewsTypes.id
inner join ritzau_data.NewsReceivers on News.id = NewsReceivers.idNews
select idNews, group_concat(isin separator ', ') as isins
from ritzau_data.NewsIsin
where idNews = News.id
group by idNews
) as isins on News.id = isins.idNews
left join (
select idNews, group_concat(distinct Category separator ', ') as categories
from ritzau_data.NewsTags

inner join ritzau_data.TagsCategoriesMap on NewsTags.idTag = TagsCategoriesMap.idTags
inner join ritzau_data.Categories on TagsCategoriesMap.idCategories = Categories.id
where idNews = News.id
group by idNews
) as categories on News.id = categories.idNews
where News.id > @idoffset and idReceiver = 3
order by News.id
limit 100;

最佳答案

问题是,新闻表处于不同的架构中,因此您必须在 where 子句中提供完全限定名称:

select [...]
from ritzau_data.News
[...]
where ritzau_data.News.id > @idoffset and idReceiver = 3
order by News.id
limit 100;

优雅的方法是为表指定别名:

select [...]
from ritzau_data.News nw
[...]
where nw.id > @idoffset and idReceiver = 3
order by nw.id
limit 100;

更新:您必须将子查询中的联接从子查询中拉出到新闻表:

SELECT News.id AS newsid, header AS title, content AS contents, created AS published_time, 2883 AS drupalid, isins, categories, NewsTypes.npName 
FROM ritzau_data.News ritzau_data.News
JOIN
(
SELECT idNews, GROUP_CONCAT(isin SEPARATOR ', ') AS isins
FROM ritzau_data.NewsIsin
GROUP BY idNews

) AS isins
ON isins.idNews = ritzau_data.News.id
JOIN
(
SELECT idNews, GROUP_CONCAT(DISTINCT Category SEPARATOR ', ') AS categories
FROM ritzau_data.NewsTags

INNER JOIN ritzau_data.TagsCategoriesMap ON NewsTags.idTag = TagsCategoriesMap.idTags
INNER JOIN ritzau_data.Categories ON TagsCategoriesMap.idCategories = Categories.id
GROUP BY idNews
) AS categories
ON categories.idNews = ritzau_data.News.id
LEFT JOIN ritzau_data.NewsTypes ON News.idType = NewsTypes.id
INNER JOIN ritzau_data.NewsReceivers ON News.id = NewsReceivers.idNews
WHERE ritzau_data.News.id > 100 AND idReceiver = 3
ORDER BY News.id
LIMIT 100;

更新2:将 News 的连接拉入子查询中:

SELECT News.id AS newsid, header AS title, content AS contents, created AS published_time, 2883 AS drupalid, isins, categories, NewsTypes.npName 
FROM ritzau_data.News ritzau_data.News
JOIN
(
SELECT idNews, GROUP_CONCAT(isin SEPARATOR ', ') AS isins
FROM ritzau_data.NewsIsin
JOIN ritzau_data.News ON idNews = ritzau_data.News.id
GROUP BY idNews

) AS isins
JOIN
(
SELECT idNews, GROUP_CONCAT(DISTINCT Category SEPARATOR ', ') AS categories
FROM ritzau_data.NewsTags

INNER JOIN ritzau_data.TagsCategoriesMap ON NewsTags.idTag = TagsCategoriesMap.idTags
INNER JOIN ritzau_data.Categories ON TagsCategoriesMap.idCategories = Categories.id
JOIN ritzau_data.News ON idNews = ritzau_data.News.id
GROUP BY idNews
) AS categories
LEFT JOIN ritzau_data.NewsTypes ON News.idType = NewsTypes.id
INNER JOIN ritzau_data.NewsReceivers ON News.id = NewsReceivers.idNews
WHERE ritzau_data.News.id > 100 AND idReceiver = 3
ORDER BY News.id
LIMIT 100;

关于mysql - 如何在子查询中使用 select 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19974068/

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