【问题标题】:Using UNION to combine same SQL Tables and searching for a specific word return duplicate rows使用 UNION 组合相同的 SQL 表并搜索特定单词返回重复行
【发布时间】:2017-09-24 00:21:15
【问题描述】:

我想和这个问题一样[在逻辑上] -> SQL/mysql - Select distinct/UNIQUE but return all columns?

使用SELECT DISTINCT PATH FROM... 而不是SELECT * FROM 不会返回重复项[UNION 有效] 但它确实只返回一个表列[PATH],我想要表的所有列而不仅仅是@987654330 @专栏。

**基本上我想做的是sql select multiple columns with only one distinct column **专栏PATH

这里是 SQLITE3 db 文件 ->https://github.com/goxr3plus/Tester

db 的示例 sql 语句:

SELECT * FROM '_44057' UNION SELECT * FROM '_76468' UNION SELECT * FROM '_25912' UNION SELECT * FROM '_12603'  WHERE PATH LIKE '%e%';

SELECT * FROM '_44057' UNION SELECT * FROM '_76468' UNION SELECT * FROM '_25912' UNION SELECT * FROM '_12603'  WHERE PATH LIKE '%e%' GROUP BY PATH; 

我正在使用SQLITE 我有 4 个具有相同数据和列的相同表。所以表包含列(PATH->这是主键、STARS、...)。

其实这里是 Table create 语句:

"CREATE TABLE '" + dataBaseTableName + "'" 
                 + "(PATH       TEXT    PRIMARY KEY   NOT NULL ,"
                 + "STARS       DOUBLE     NOT NULL,"
                 + "TIMESPLAYED  INT     NOT NULL,"
                 + "DATE        TEXT    NOT NULL,"
                 + "HOUR        TEXT    NOT NULL)");

我想要做的是搜索那些包含特定单词的items-songs,例如a。 所以我使用UNION 收集所有表数据,最后使用WHERE STATEMENT 和LIKE,最后我将结果限制为50。我也不想重复但由于某种原因我得到重复的行...

  • 问题:

1) 重复的行被返回

2)当表格包含大量元素时,它会变慢

  • 以下代码的小解释:
  1. 在哪里可以看到'%" + word + "%',例如,单词是String a
  2. 下面的 SQL 语句是动态生成的,我的意思是我可以 有超过 4 个表,每个表可以包含数千个 歌曲 [这有时会导致查询很慢)

简单的SQL代码:

SELECT * FROM '_44057'
 UNION 
SELECT * FROM '_76468' 
UNION 
SELECT * FROM '_25912' 
UNION 
SELECT * FROM '_12603' 
WHERE PATH LIKE '%" + word + "%' LIMIT 50

最后:

任何建议,我的意思是从 LIKESelectUNION 的任何建议都非常感谢替换因为我是新手 :)。

来自重复行的图像:

【问题讨论】:

  • 你能把你的桌子的ddl贴出来吗?也许你可以使用路径加入和分组
  • 这是因为所有表都有 PATH 列。我正在尝试查询 atm 是否有效
  • 将 UNION 替换为 UNION ALL。但是要搜索单词,您需要FTS
  • 这就是为什么我建议使用专门创建的玩具数据库制作一个仅命令行的 mcve,其中填充了合适的示例数据和一个查询来显示您的问题(仅此而已)。您可以转储制作屏幕截图的数据吗?你能找到数据库结构吗?用它来制作玩具。我认为,如果您能够做到这一点,人们将能够帮助您找到问题。其实我相信你会在制作那个mcve时自己找到它。不要让您的 GUI 或您的语言 API 向您隐藏问题的详细信息。我认为其他 cmets 的意思是一样的。
  • @XtremeBaumer 阅读所有 cmets,我只是注意到您提到了我认为的主要技巧 - 更早。积分;虽然我自己也想过。

标签: java sqlite join union


【解决方案1】:

这是解决方案的SQLite部分,请自行包装成java:

SELECT * FROM (
  SELECT * FROM _12603 UNION ALL 
  SELECT * FROM _25912 UNION ALL 
  SELECT * FROM _44057 UNION ALL 
  SELECT * FROM _76468
) 
WHERE 
REPLACE(path, rtrim(path, replace(path, '\', '')), '') -- only filename
LIKE '%e%' GROUP BY path;

没有明确控制使用哪一行相同的路径。
OP 已经(在聊天中)声明任何一个都可以,不需要特殊选择。
所以只使用group by 就足够了。
但是,欢迎 cmets 了解这(使用不带聚合功能的 group by)是否干净/便携/可靠。

我用 OP 测试了 mcve 和
SQLite 3.18.0 2017-03-28 18:48:43 424a0d380332858ee55bdebc4af3789f74e70a2b3ba1cf29d84b9b4bcf3e2e37

OP 试用了https://sqliteonline.com 并很满意。

顺便提一下:在聊天中,OP 发现了一个不需要的解决方法(对于我的一些愚蠢),它提高了效率。

使用 ungalcrys 的完全惊人的答案到
How to get the last index of a substring in SQLite?

【讨论】:

  • @ungalcrys 只是为了确保你得到“复制的赞美”。
  • 对于任何使用此功能并需要速度的人:OP 注意到由于使用 rtrim 仅在文件名(而不是路径)中搜索而导致速度下降。 OP 考虑引入一个仅文件名列来解决这个问题。
  • 如果有人提高REPLACE(path, rtrim(path, replace(path, '\', '')), '') 的速度或通常是你的答案:),我会在几天内开放赏金,然后我会接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2017-05-07
相关资源
最近更新 更多