mysql查询从另一个表

时间:2016-09-26 13:55:44

标签: mysql select

我有两个表,一个是索引(或地图),在拉取查询时有助于其他表。

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;

那么我做错了什么,哪个是网络,没有显示从子查询“值”得到的值?

由于

1 个答案:

答案 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。

相关问题