检查问题此SELECT查询需要180秒才能完成(检查问题本身的注释).
IN只能与一个值进行比较,但时差仍然很大.
为什么会那样?
category_product
---------------
id_category
id_product
product
---------------
id_product
id_manufacturer
manufacturer
---------------
id_manufacturer
name
Run Code Online (Sandbox Code Playgroud)
我如何创建一个SQL查询,以便在id_category等于某事时从制造商中选择所有名称?
实现子句中最简单,最快速的方法是什么,必须匹配数组中的所有元素 - 使用时不仅仅是一个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
添加有关架构和案例的更多信息:
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)对话有很多用户,用户属于许多对话.为了找到对话中的所有用户,我正在使用此连接表.
最后,我试图在轨道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
我有一个下表结构.
USERS
PROPERTY_VALUE
PROPERTY_NAME
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) 我有一个交叉引用表:
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匹配所有标签.
过去两天我一直在拔头发.希望有人可以帮助我.
我有两张桌子:
游戏
`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)
我知道我解释了这个可怕的(不能在我的脑海里说出来),所以如果你有任何问题,请发表评论.
我有桌子:
CandidatesCandidateLanguagesCandidateSkills每位候选人可能拥有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"
我知道问题是尝试从语言和技能表中选择多个记录,我认为可能需要连接,但现在我迷路了......
我正在尝试检查数据库是否存在特定组合.
表: 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) 我有一个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) 我真的很难优化这个查询:
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
sql ×9
mysql ×5
postgresql ×4
activerecord ×1
comparison ×1
indexing ×1
join ×1
many-to-many ×1
performance ×1
php ×1
select ×1