【问题标题】:Issue with mysql query that calls column name from another table从另一个表调用列名的mysql查询问题
【发布时间】: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 等。我知道我在解释这个问题,但我认为这对你来说会更容易

标签: mysql select


【解决方案1】:
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 列的行,其中 p.va = MjU 和 p.network = RUU 和p.provider_id = v.provider_id.

我试图在 cmets 中解释的是子查询对其外部查询一无所知:

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,但尚未定义v,因此结果为假。

【讨论】:

  • 谢谢你,我看过你说的,但我想我为什么要努力实现我不能只用一个查询。我不知道列的名称,它在 smv 中,并且我无法找到具有正确 ID 的提供者,因为它在 smv 中。我想在一个查询中执行此操作,但似乎我做不到。
  • 如果您可以编辑您的问题并显示一些示例数据表,以便我们可以清楚地了解您拥有的数据库结构,然后我们可以尝试为您制作一个执行您操作的 SQL 查询想要。
  • 今天早上sqlfiddle浪费了一个多小时,在线什么工具可以做到这一点?
  • 我没有太多的 SQLFiddle 经验,但类似的东西。我认为您的 SQL 表中的 show create table 输出也会有所帮助。显然修剪它然后[手动]用一些数据填充它,您可以手动写出例如每个表中的几个重要列行,我们不需要问题中未提及的列,并且将它放在 edit 中,因为有时人们尝试在 cmets 中编写代码,但阅读和理解起来很混乱。 :-)
  • @BadAddy 哦,对不起,我刚刚看到你的更新,是的,这正是我所追求的......
猜你喜欢
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
相关资源
最近更新 更多