我有三张桌子:
users: sports: user_sports:
id | name id | name id_user | id_sport | pref
---+-------- ---+------------ --------+----------+------
1 | Peter 1 | Tennis 1 | 1 | 0
2 | Alice 2 | Football 1 | 2 | 1
3 | Bob 3 | Basketball 2 | 3 | 0
3 | 1 | 2
3 | 3 | 1
3 | 2 | 0
Run Code Online (Sandbox Code Playgroud)
该表user_sports链接users并sports具有优先顺序(pref).
我需要创建一个返回此的查询:
id | name | …Run Code Online (Sandbox Code Playgroud) 我正在开发一个名为PHP-Bouncer的开源项目,我正在为我正在编写的MySQL Query遇到问题.基本上我们有三个表:BouncerRoles,PageInRole和BouncerPageOverrides.BouncerRoles包含访问级别,另外两个表通过外键链接回BouncerRoles并提供多个附加数据条目.我编写了以下查询以尝试同时提取我需要的所有角色数据:
select BouncerRoles.RoleID, BouncerRoles.RoleName,
GROUP_CONCAT(PageInRole.PageName separator '|') as ProvidedPages,
GROUP_CONCAT(CONCAT(BouncerPageOverrides.OverriddenPage,'&',BouncerPageOverrides.OverridingPage) separator '|') as OverriddenPages
from BouncerRoles join PageInRole on BouncerRoles.RoleID = PageInRole.RoleID
join BouncerPageOverrides on BouncerRoles.RoleID = BouncerPageOverrides.RoleID
group by BouncerRoles.RoleID;
Run Code Online (Sandbox Code Playgroud)
此查询的目标是提供RoleID,RoleName,提供的页面的管道分隔列表,以及管道分隔的覆盖列表(以覆盖页和覆盖页的形式).一切都有效,除了查询的最后一列,它会像这样重复一遍又一遍地找到的条目(以CSV格式输出):
RoleID,RoleName,ProvidedPages,OverriddenPages
2,Exchange,exchange-how.php|exchange-support.php|exchange.php|premium-promo.php|exchange-resorts.php|premiumplus-promo.php|exchange-deposit.php|exchange-requestdestination.php,whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php|whyexchange.php&exhange.php
3,Premium,premiumplus-promo.php|premium-cruises.php|premium-resorts.php|premium-condohome.php|premium-hotelaircar.php|premium.php|premium-restaurants.php|premium-overview.php,premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php|premium-promo.php&premium.php
4,"Premium Plus",premiumplus-exclusiveescapes.php|premiumplus.php|premiumplus-overview.php|premiumplus-concierge.php|premiumplus-airportlounge.php,premiumplus-promo.php&premiumplus.php|premiumplus-promo.php&premiumplus.php|premiumplus-promo.php&premiumplus.php|premiumplus-promo.php&premiumplus.php|premiumplus-promo.php&premiumplus.php
Run Code Online (Sandbox Code Playgroud)
在我的查询中有没有我做错了导致这个?
我有一个"歌曲","Songs_Tags"(与歌曲相关的歌曲)和"Songs_Votes"(与布尔喜欢/不喜欢的歌曲相关)的表格.
我需要使用其标签的GROUP_CONCAT()以及喜欢(真实)和不喜欢(假)的数量来检索歌曲.
我的查询是这样的:
SELECT
s.*,
GROUP_CONCAT(st.id_tag) AS tags_ids,
COUNT(CASE WHEN v.vote=1 THEN 1 ELSE NULL END) as votesUp,
COUNT(CASE WHEN v.vote=0 THEN 1 ELSE NULL END) as votesDown,
FROM Songs s
LEFT JOIN Songs_Tags st ON (s.id = st.id_song)
LEFT JOIN Votes v ON (s.id=v.id_song)
GROUP BY s.id
ORDER BY id DESC
Run Code Online (Sandbox Code Playgroud)
问题是,当一首歌有超过1个标签时,它会被多次返回,所以当我执行COUNT()时,它会返回更多结果.
我能想到的最好的解决方案是,如果能够在GROUP BY之后进行最后的LEFT JOIN(现在每首歌只有一个条目).然后我需要另一个GROUP BY m.id.
有没有办法实现这一目标?我需要使用子查询吗?
我正在形成一个select语句,我收到了这个错误.
FUNCTION GROUP_CONCAT不存在.检查参考手册中的"功能名称解析和解决方案"部分
我不明白这一点,因为小组concats使用了有人给我的代码,我构建了我的新代码.这是它的外观
SELECT
`shirts`.`shirt_name`,
`shirts`.`men` AS `main_photo`,
GROUP_CONCAT (`shirt_sizes`.`size_name`) AS `sizes`
FROM
`shirts`
JOIN
`shirts_link` ON `shirts_link`.`shirt_id`=`shirts`.`id`
JOIN
`shirt_sizes` ON `shirt_sizes`.`id`=`shirts_link`.`size_id`
JOIN
`shirt_prices` ON `shirt_prices`.`id`=`shirts_link`.`price_id`
WHERE `men`!=''
GROUP BY
`shirt_prices`.`price_cat`
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
我正在使用Grunt-usemin.但是连接的JS没有用';'正确分隔.我怎么告诉usemin只为JS文件而不是CSS文件添加分隔符?
目前,我的usemin任务看起来像这样:
useminPrepare: {
options: {
dest: '<%= config.dist %>'
},
html: '<%= config.app %>/index.html'
},
// Performs rewrites based on rev and the useminPrepare configuration
usemin: {
options: {
assetsDirs: ['<%= config.dist %>', '<%= config.dist %>/images']
},
concat: {
separator: ';'
},
html: ['<%= config.dist %>/{,*/}*.html'],
css: ['<%= config.dist %>/styles/{,*/}*.css']
},
Run Code Online (Sandbox Code Playgroud)
另一个用例是将每个连接模块包装在IIFE中,这需要这种配置,但只应该应用于*.js文件:
concat: {
options: {
banner: ';(function () {',
separator: '})(); (function () {',
footer: '})();'
}
}
Run Code Online (Sandbox Code Playgroud) 首先,我需要指出我在我的机器上运行了Wikipedia转储的sql文件,并且能够运行我需要更新许多有关内存和其他设置上可用索引大小的设置.我只想提一下,那些大的SQL查询运行成功,我没有任何关于内存或超时的问题.
现在我有一个表pagelinks(pl_from,pl_title),显示每个维基百科页面中出现的链接,例如数据可以是(1,"title1"),(1,"title2"),(2,"title3") ),(2,"title1").我想创建一个通过pl_from连接titles组的表.为此,这是我的SQL查询(我正在使用工作台):
SET @@group_concat_max_len=150000;
create table concatpagelinks
(SELECT pl_from, GROUP_CONCAT(pl_title , ' ') as links FROM pagelinks GROUP BY pl_from)
Run Code Online (Sandbox Code Playgroud)
运行此查询我收到错误:"在查询期间丢失了与mysql服务器的连接",系统再次询问我密码.所以我搜索并找到了这个.因此我将net_read_timeout更改为1000并将connect_timeout更改为60.它没有解决问题,所以我将查询更改为:
SET @@group_concat_max_len=150000;
create table concatpagelinks
(SELECT pl_from, GROUP_CONCAT(pl_title , ' ') as links FROM pagelinks GROUP BY pl_from limit 0,1000)
Run Code Online (Sandbox Code Playgroud)
仍然是同样的问题,令人惊奇的是每次查询运行600.495秒并且错误发生.
如何找到每个页面的所有标签,然后将标签连成一列?
举个例子,
页表,
page_id
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
标签表,
tag_id tag_name
1 A
2 B
3 C
4 D
Run Code Online (Sandbox Code Playgroud)
标记表,
page_id tag_id
1 1
1 2
1 3
3 2
3 3
Run Code Online (Sandbox Code Playgroud)
我的工作查询,
SELECT
p.page_id,
GROUP_CONCAT(t.tag_name ORDER BY t.tag_name ASC SEPARATOR ",") AS tags
FROM root_pages AS p
LEFT JOIN root_mm_pages_tags AS m
ON p.page_id = m.page_id
LEFT JOIN root_tags AS t
ON t.tag_id = m.tag_id
WHERE p.page_id = t.page_id
Run Code Online (Sandbox Code Playgroud)
这是我追求的结果,
page_id tags
1 A, B, C
2 NULL
3 …Run Code Online (Sandbox Code Playgroud) 我有一张桌子
CREATE TABLE IF NOT EXISTS `dept` (
`did` int(11) NOT NULL,
`dname` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `dept` (`did`, `dname`) VALUES
(1, 'Hi'),
(2, NULL),
(3, 'Hello');
Run Code Online (Sandbox Code Playgroud)
然后我有一个查询
select group_concat(concat(did,"','",dname) separator '),(') as Result from dept
Run Code Online (Sandbox Code Playgroud)
它正在产生结果 1','Hi'),('3','Hello
问题:如何从上面的查询得到结果1','Hi'),('2','NULL'),('3','Hello
它缺少具有NULL值但我需要获取所有值的行
更新:如果我有多个或所有列允许NULL,是否有一些方法可以为所有列应用COALESCE或者必须在每个列单独应用?
有可能做这样的事情:
GROUP_CONCAT(user, price SEPARATOR ', ') AS items
Run Code Online (Sandbox Code Playgroud)
结果是 John3.99, Mike24.99
我需要的是:
John - 3.99, Mike - 24.99
Run Code Online (Sandbox Code Playgroud)
基本上在价格领域使用另一种类型的分隔符.
我想按某些列按表分组并显示其他列的值。在 SQL v.2017 中我可以使用 string_agg 函数来做到这一点。但我的 SQL 版本是 2012。我该怎么做...
create table dbo.TaskPeriods
(
[id] [int] NULL,
[startDate] [datetime] NULL,
[endDate] [datetime] NULL
)
-------------------------------
insert into test.dbo.TaskPeriods values(1,'2018-07-24 00:00:00.000','2018-07-24 10:00:00.000')
insert into test.dbo.TaskPeriods values(2,'2018-07-24 00:00:00.000','2018-07-24 10:00:00.000')
insert into test.dbo.TaskPeriods values(3,'2018-07-24 08:00:00.000','2018-07-24 12:00:00.000')
--------------------------------------------------------
select id,startDate,endDate from test.dbo.TaskPeriods
--------------------------------------------------------
select
min (startDate)
,max (endDate)
--,string_agg(id,',') //How to Do this Without string_agg Function
FROM test.dbo.TaskPeriods
group by startDate,endDate
Run Code Online (Sandbox Code Playgroud)
有没有办法将一个特定列与 SQL Server 12.0 中的另一组列连接起来?
group-concat ×10
mysql ×8
sql ×3
join ×2
concat ×1
group-by ×1
grunt-usemin ×1
gruntjs ×1
php ×1
select ×1
string-agg ×1
tagging ×1
timeout ×1