【发布时间】:2016-09-26 13:55:44
【问题描述】:
我有两个表,一个是索引(或映射),在提取查询时会有所帮助。
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 上,但它一直在崩溃,所以我只想检查我的代码是否真的错误,因此崩溃了?
在上面的示例中,我正在查看列网络的 providers 表,其中 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 的正确列,使用上面的示例它会返回“值”。所以我现在需要在 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;
上面返回空白,但如果我在 WHERE 子句中用我知道存在的列替换 net,我确实得到了预期的结果:
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;
那么我做错了什么,这是净值,没有显示从子查询“值”派生的值?
谢谢
【问题讨论】:
-
我认为选择中的
selects 首先执行,因此您的第一个内部选择将不知道v.provider_id是什么,因为它没有在内部选择中引用。同样的问题也适用于第二个内部选择。 -
所以如果我反转它,它应该可以工作?
-
也许,MySQL 处理子查询的顺序是执行内部查询,而不知道外部查询的值。所以你需要将
v的值插入到内部查询中。根据您的 SQL 的外观,您应该使用JOINs。 -
我真的很讨厌别人给别人打分,但不解释原因!
-
我很抱歉,但我越看这个方法,就越觉得这种方法极大地限制了数据库的实用性。你读过many-to-many SQL 关系吗?看起来你有点需要这种方法,而不是 G 或 F 你有一个列名
COL(仅示例)并且在 COL 中你有另一个表的行,例如COL_name和那一行col_name你的值是va或value等。我知道我在解释这个问题,但我认为这对你来说会更容易