- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
首先:我不太清楚该在问题标题中输入什么,我不知道如何调用这样的查询,也许这就是我找不到任何答案的原因。
我有一个广播电台表和一个流表。每个广播电台可以有多个流,用于不同的格式、比特率等。我想获取所有电台的列表,以及给定应用程序首选格式的流。
现在这很棘手,我希望首选格式为列表,并且我的数据库应返回第一个合适的流。
所以我可能有一个这样的列表:('MP3', 'AAC', 'OGG')
然后我希望 MySQL 为每个站点返回“MP3”类型的流,但如果它不存在,它应该返回该站点的“AAC”流,依此类推。如果没有找到合适的流,它不应该返回站。
示例:
CREATE TABLE `stations` (
`id` INT(11),
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `streams` (
`id` INT(11),
`station` INT(11),
`media_type` ENUM('MP3', 'OGG', 'AAC', 'Flash'),
PRIMARY KEY (`id`),
KEY (`station`),
CONSTRAINT `fk_1` FOREIGN KEY (`station`) REFERENCES `stations` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
INSERT INTO `stations` (`id`) VALUES (1), (2), (3);
INSERT INTO `streams` (`id`, `station`, `media_type`) VALUES (1, 1, 'MP3'), (2, 1, 'AAC'), (3, 2, 'Flash'), (4, 2, 'AAC'), (5, 3, 'Flash');
我做了一个SQLFiddle here
如果首选媒体类型列表是('MP3', 'AAC')
,那么使用上面示例数据的期望结果应该是:
station stream type
1 1 MP3
2 4 AAC
我试过了:
SELECT
st.id AS station_id,
str.id AS stream_id,
str.media_type,
FIELD(str.media_type, 'MP3', 'AAC') AS preference
FROM
stations st
LEFT JOIN
streams str ON str.station = st.id
GROUP BY
st.id
HAVING
MIN(preference)
但是根据流表中的第一条记录是否是首选媒体类型,它只返回 1 或 0 条记录,我不明白为什么。
我能找到的唯一解决方案是使用子查询对流进行排序,然后按 station_id 分组,如下所示:
SELECT sub.* FROM
(SELECT
st.id AS station_id,
str.id AS stream_id,
str.media_type
FROM
stations st
LEFT JOIN
streams str ON str.station = st.id
WHERE
str.media_type IN ('MP3', 'AAC')
ORDER BY
FIELD(str.media_type, 'MP3', 'AAC')
) AS sub
GROUP BY sub.station_id
但这会导致子查询正在创建的临时表的全表扫描,性能无法接受。由于我们不能限制内部查询(因为它还没有分组),临时表会变得非常大。
顺便说一句,我正在运行 MySQL 5.6
那么,我应该使用哪种查询来处理首选属性列表?
最佳答案
如果您只想返回 'MP3'
或 'AAC'
存在的行,则不需要外连接。
这是一个标准 SQL 解决方案,可以在 mysql 中按原样工作,请参阅 fiddle :
SELECT
st.id AS station_id,
COALESCE(MAX(CASE WHEN str.media_type = 'MP3' THEN str.id END)
,MAX(CASE WHEN str.media_type = 'AAC' THEN str.id END)
) AS stream_id,
COALESCE(MAX(CASE WHEN str.media_type = 'MP3' THEN str.media_type END)
,MAX(CASE WHEN str.media_type = 'AAC' THEN str.media_type END)
) AS media_type
FROM stations st
JOIN streams str
ON str.station = st.id
WHERE -- only stations with the requested media types
str.media_type IN ('MP3', 'AAC')
GROUP BY st.id
添加更多媒体类型很容易,主要是剪切和粘贴。COALESCE 根据 CASE 的顺序返回第一个匹配的媒体类型。
关于mysql - SQL 按首选值列表分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32080957/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!