相关疑难解决方法(0)

为什么IN条件比sql中的"="慢?

检查问题此SELECT查询需要180秒才能完成(检查问题本身的注释).
IN只能与一个值进行比较,但时差仍然很大.
为什么会那样?

mysql sql comparison performance

28
推荐指数
1
解决办法
5808
查看次数

SQL多对多选择

category_product
---------------
id_category
id_product

product
---------------
id_product
id_manufacturer

manufacturer
---------------
id_manufacturer
name
Run Code Online (Sandbox Code Playgroud)

我如何创建一个SQL查询,以便在id_category等于某事时从制造商中选择所有名称?

mysql sql many-to-many

27
推荐指数
2
解决办法
5万
查看次数

所有在数组中的PostgreSQL

实现子句中最简单,最快速的方法是什么,必须匹配数组中的所有元素 - 使用时不仅仅是一个IN?毕竟它应该像mongodb的$ all.

考虑到conversation_users是conversation_id和user_id之间的连接表的群组对话,我有类似这样的想法:

WHERE (conversations_users.user_id ALL IN (1,2))
Run Code Online (Sandbox Code Playgroud)

更新 16.07.12

添加有关架构和案例的更多信息:

  1. join-table非常简单:

                  Table "public.conversations_users"
         Column      |  Type   | Modifiers | Storage | Description 
    -----------------+---------+-----------+---------+-------------
     conversation_id | integer |           | plain   | 
     user_id         | integer |           | plain   | 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对话有很多用户,用户属于许多对话.为了找到对话中的所有用户,我正在使用此连接表.

  3. 最后,我试图在轨道scope上找出一个红宝石,根据它的参与者找到我的对话 - 例如:

    scope :between, ->(*users) {
      joins(:users).where('conversations_users.user_id all in (?)', users.map(&:id))
    }
    
    Run Code Online (Sandbox Code Playgroud)

更新 23.07.12

我的问题是找到一个完全匹配的人.因此:

(1,2,3)如果查询,则之间的对话将不匹配(1,2)

sql postgresql activerecord ruby-on-rails relational-division

25
推荐指数
3
解决办法
2万
查看次数

在WHERE子句中多次使用相同的列

我有一个下表结构.

USERS

USERS数据

PROPERTY_VALUE

PROPERTY_VALUE数据

PROPERTY_NAME

PROPERTY_NAME数据

USER_PROPERTY_MAP

USER_PROPERTY_MAP数据

我正在尝试从users表中检索具有匹配属性的用户property_value.

单个用户可以拥有多个属性.这里的示例数据有2个用户'1'的属性,但是可以有2个以上.我想在WHERE子句中使用所有这些用户属性.

如果用户具有单个属性但是对于多于1个属性失败,则此查询有效:

SELECT * FROM users u
INNER JOIN user_property_map upm ON u.id = upm.user_id
INNER JOIN property_value pv ON upm.property_value_id = pv.id
INNER JOIN property_name pn ON pv.property_name_id = pn.id
WHERE (pn.id = 1 AND pv.id IN (SELECT id FROM property_value WHERE value like '101')
AND pn.id = 2 AND pv.id IN (SELECT id FROM property_value WHERE value like '102')) and u.user_name = 'user1' and u.city = …
Run Code Online (Sandbox Code Playgroud)

sql postgresql relational-division

11
推荐指数
4
解决办法
1276
查看次数

Mysql - 选择与所有标签匹配的ID

我有一个交叉引用表:

ID | tag
1  | 4
1  | 5
1  | 6
2  | 4
2  | 5
2  | 8
3  | 2
Run Code Online (Sandbox Code Playgroud)

我需要选择与所有一组标签匹配的ID .例如,如果给'4','5'我标签,我会得到ID '1','2'.如果给我标签,'4','2'我将不会获得任何ID,因为没有匹配所有标签的ID .

此外,如果给我标签,'4','9'那么我也不应该得到任何结果ID,因为搜索'9'会产生一个NULL值,因此没有ID匹配所有标签.

过去两天我一直在拔头发.希望有人可以帮助我.

mysql sql select

10
推荐指数
1
解决办法
2772
查看次数

MySQL通过另一个表找到行

我有两张桌子:

游戏

`id`        INT(11)
Run Code Online (Sandbox Code Playgroud)

game_tags

`game`      INT(11)
`tag_id`    INT(11)
Run Code Online (Sandbox Code Playgroud)

game_tags.game = game.id

我对MySQL很恐怖,所以这是我的问题:我希望能够找到games具有一定数量的MySQL tag_id.所以,如果我有四个tag_id(3,5,7,11),我希望能够通过查看game_tags表格找到哪些游戏将拥有所有这四个标签.这是我的意思的一个例子:

伪MySQL的:

SELECT *
FROM `games`
WHERE (search through game_tags table and find which rows have the same `game` field and all of the tag_id's that I need to search for)
LIMIT 0, 15
Run Code Online (Sandbox Code Playgroud)

我知道我解释了这个可怕的(不能在我的脑海里说出来),所以如果你有任何问题,请发表评论.

php mysql sql relational-division

6
推荐指数
1
解决办法
169
查看次数

复杂的SQL语句:选择匹配多个表

我有桌子:

  • Candidates
  • CandidateLanguages
  • CandidateSkills

每位候选人可能拥有1种以上的语言和1种以上的技能

所以对于Candidate"FRED",他的记录CandidateLanguages可能是

FRED - ENGLISH
FRED - FRENCH
Run Code Online (Sandbox Code Playgroud)

他的记录CandidateSkills可能是

FRED - RUNNING
FRED - JUMPING
Run Code Online (Sandbox Code Playgroud)

而对于Candidate"JIM"他的记录CandidateLanguages可能是

JIM - ENGLISH
Run Code Online (Sandbox Code Playgroud)

他的记录CandidateSkills可能是

JIM - RUNNING
Run Code Online (Sandbox Code Playgroud)

我的查询需要选择符合多种技能和语言的候选人.

例如,用英语:

选择所有所选语言的所有候选人,并拥有所有选定的技能......

或换一种方式....

SELECT ALL candidates WHERE 
(language = 'FRENCH' AND language is 'ENGLISH') AND 
(skill = 'RUNNING' AND skill = 'JUMPING') 
Run Code Online (Sandbox Code Playgroud)

在上面两个候选人中,这应该只返回"FRED"

我知道问题是尝试从语言和技能表中选择多个记录,我认为可能需要连接,但现在我迷路了......

sql

6
推荐指数
1
解决办法
198
查看次数

以高级方式选择WHERE

我正在尝试检查数据库是否存在特定组合.

表: conversations

+----+
| id |
+----+
| 1  |
| 2  |
| 3  |
| 4  |
| 5  |
+----+
Run Code Online (Sandbox Code Playgroud)

表: conversations_users

+----+--------------+------+
| id | conversation | user |
+----+--------------+------+
| 1  | 1            | 1    |
| 2  | 1            | 2    |
| 3  | 2            | 1    |
| 4  | 2            | 2    |
| 5  | 2            | 3    |
| 6  | 2            | 4    |
| 7  | …
Run Code Online (Sandbox Code Playgroud)

mysql sql join

5
推荐指数
1
解决办法
605
查看次数

查找一列中具有相同值的行和另一列中的其他值?

我有一个PostgreSQL数据库,用于将用户存储在users表中,并将对话存储在conversation表中.由于每个用户都可以参与多个对话,并且每个对话都可能涉及多个用户,因此我有一个conversation_user链接表来跟踪哪些用户参与每个对话:

# conversation_user
id  |  conversation_id | user_id
----+------------------+--------
1   |                1 |      32
2   |                1 |       3
3   |                2 |      32
4   |                2 |       3
5   |                2 |       4
Run Code Online (Sandbox Code Playgroud)

在上表中,用户32只与用户3进行一次对话,另一次与3和用户4进行对话.如何编写一个查询,表明只有用户32和用户3之间有对话?

我尝试过以下方法:

SELECT conversation_id AS cid,
       user_id
FROM conversation_user
GROUP BY cid HAVING count(*) = 2
AND (user_id = 32
     OR user_id = 3);

SELECT conversation_id AS cid,
   user_id
FROM conversation_user
GROUP BY (cid HAVING count(*) = 2
AND (user_id …
Run Code Online (Sandbox Code Playgroud)

sql postgresql relational-division

5
推荐指数
1
解决办法
9258
查看次数

慢速嵌套循环左循环连接索引扫描130k次

我真的很难优化这个查询:

SELECT wins / (wins + COUNT(loosers.match_id) + 0.) winrate, wins + COUNT(loosers.match_id) matches, winners.winning_champion_one_id, winners.winning_champion_two_id, winners.winning_champion_three_id, winners.winning_champion_four_id, winners.winning_champion_five_id
FROM
(
   SELECT COUNT(match_id) wins, winning_champion_one_id, winning_champion_two_id, winning_champion_three_id, winning_champion_four_id, winning_champion_five_id FROM matches
   WHERE
      157 IN (winning_champion_one_id, winning_champion_two_id, winning_champion_three_id, winning_champion_four_id, winning_champion_five_id)
   GROUP BY winning_champion_one_id, winning_champion_two_id, winning_champion_three_id, winning_champion_four_id, winning_champion_five_id
) winners
LEFT OUTER JOIN matches loosers ON
  winners.winning_champion_one_id = loosers.loosing_champion_one_id AND
  winners.winning_champion_two_id = loosers.loosing_champion_two_id AND
  winners.winning_champion_three_id = loosers.loosing_champion_three_id AND
  winners.winning_champion_four_id = loosers.loosing_champion_four_id AND
  winners.winning_champion_five_id = loosers.loosing_champion_five_id
GROUP BY winners.wins, winners.winning_champion_one_id, winners.winning_champion_two_id, winners.winning_champion_three_id, winners.winning_champion_four_id, …
Run Code Online (Sandbox Code Playgroud)

postgresql indexing database-performance postgresql-performance postgresql-9.6

5
推荐指数
2
解决办法
5314
查看次数