我有两个表,一个是索引(或地图),在拉取查询时有助于其他表。
SELECT v.*
FROM smv_ v
WHERE (SELECT p.network
FROM providers p
WHERE p.provider_id = v.provider_id) = 'RUU='
AND (SELECT p.va
FROM providers p
WHERE p.provider_id = v.provider_id) = 'MjU='
LIMIT 1;
因为我们不知道保存主数据的列的名称,所以我们需要使用两个表中的provider_id进行查找,然后查询。
我没有收到任何错误,但也没有数据。我花了过去一小时试图将它放在sqlfiddle上,但它一直在崩溃,所以我只是想检查一下我的代码是否真的错了,因此崩溃了吗?
在上面的例子中,我在提供者表中寻找列网络,其中provider_id匹配,然后将其用作smv上的列。
我确信我之前已经这样做了,但在周末尝试之后我想我会在这里问。
先谢谢。
更新
以下是数据示例:
这是提供者,这个链接所以无论smv表上的列名是什么,我们都可以链接它们。
+---+---+---------------+---------+-------+--------+-----+-------+--------+
| | A | B | C | D | E | F | G | H |
+---+---+---------------+---------+-------+--------+-----+-------+--------+
| 1 | 1 | Home | network | batch | bs | bp | va | bex |
| 2 | 2 | Recharge | code | id | serial | pin | value | expire |
+---+---+---------------+---------+-------+--------+-----+-------+--------+
在上面的示例中,G将在smv列中表示充值,我们是值。这就是我们在WHERE子句中寻找的东西。
这是smv表:
+---+---+-----------+-----------+---+----+---------------------+-----+--+
| | A | B | C | D | E | F | value | va |
+---+---+-----------+-----------+---+----+---------------------+-----+--+
| 1 | 1 | X2 | Home | 4 | 10 | 2016-09-26 15:20:58 | | 7 |
| 2 | 2 | X2 | Recharge | 4 | 11 | 2016-09-26 15:20:58 | 9 | |
+---+---+-----------+-----------+---+----+---------------------+-----+--+
上述相同示例中的值为9,或'RUU ='已解码。
所以我们不知道行的名称,直到调用smv的行,一旦我们有了这个行,我们就可以查找获取正确信息所需的列名。
希望这有帮助。
更多信息
在触发时,我们不知道该行由正确的数据组成,因为许多字段都是空的。地图可以帮助我们查询正确的列,以获得正确的行(smv随着时间的推移而增长,具体取决于上传的内容。)
1) SELECT p.va FROM providers p WHERE p.network = 'Recharge' ;
2) SELECT s.* FROM smv s, providers p WHERE p.network = 'Recharge';
1)给我一个正确的列,我需要查找和查询smv,使用上面的例子,它将返回“value”。所以我现在需要在smv表中查找C = Recharge和value ='9'。这应该让我回到smv表的第2行。
因此,单独的1和2查询都可以工作,但我需要将它们放在一起,以便在数据库服务器上完成查询。
希望这能提供更多见解
更多信息
通过阅读其他不真正做我需要的帖子,我想出了这个:
SELECT s.*
FROM (SELECT
(SELECT p.va
FROM dh_smv_providers p
WHERE p.provider_name = 'vodaphone'
LIMIT 1) AS net,
(SELECT p.bex
FROM dh_smv_providers p
WHERE p.provider_name = 'vodaphone'
LIMIT 1) AS bex
FROM dh_smv_providers) AS val, dh_smv_ s
WHERE s.provider_id = 'vodaphone' AND net = '20'
ORDER BY from_base64(val.bex) DESC;
以上是空白的,但是如果我替换net,在WHERE子句中我知道存在的列,我确实得到了预期的结果:
SELECT s.*
FROM (SELECT
(SELECT p.va
FROM dh_smv_providers p
WHERE p.provider_name = 'vodaphone'
LIMIT 1) AS net,
(SELECT p.bex
FROM dh_smv_providers p
WHERE p.provider_name = 'vodaphone'
LIMIT 1) AS bex
FROM dh_smv_providers) AS val, dh_smv_ s
WHERE s.provider_id = 'vodaphone' AND value = '20'
ORDER BY from_base64(val.bex) DESC;
那么我做错了什么,哪个是网络,没有显示从子查询“值”得到的值?
由于
答案 0 :(得分:0)
SELECT
v.*,
p.network, p.va
FROM
smv_ v
INNER JOIN
providers p ON p.provider_id = v.provider_id
WHERE
p.network = 'RUU=' AND p.va = 'MjU='
LIMIT 1;
表格通过JOIN
语法相互通信。这完全绕过了子选择的需要(和限制)。
INNER JOIN
表示只返回完全成功的匹配项,您可能需要针对您的情况调整此type of join,但SQL将返回所有v
列中的一行{{ 1}}和p.va = MjU
以及p.network = RUU
。
我在评论中试图解释的是,子查询对其外部查询没有任何了解:
p.provider_id = v.provider_id
此布局(正如您的问题所示)是SELECT *
FROM a
WHERE (SELECT * FROM b WHERE a)
AND (SELECT * FROM c WHERE a OR b)
对b
一无所知,因为首先执行a
查询,然后执行b
查询,然后最后是c
查询。因此,您的原始查询正在查找a
,但尚未定义WHERE p.provider_id = v.provider_id
,因此结果为false。