【问题标题】:Mysql query with multiple columns具有多列的Mysql查询
【发布时间】:2015-02-21 07:06:42
【问题描述】:

我有两个表,例如表 A 和表 B。表 A 和 B 中的列名分别是

        A                      B
------------------------   -----------------------  
| ID | sID | qID | fID |   | xmlText | sID | qID |
------------------------   -----------------------
| 1  |  1  |  1  | 213 |   |   xml   |  1  |  1  |
| 2  |  1  |  2  | 213 |   |   xml   |  1  |  2  |
| 3  |  1  |  3  | 213 |   |   xml   |  1  |  3  |
| 4  |  2  |  1  | 213 |   |   xml   |  2  |  1  |
| 5  |  2  |  2  | 213 |   |   xml   |  2  |  2  |
| 6  |  2  |  3  | 213 |   |   xml   |  2  |  3  |
| 7  |  4  |  1  | 214 |   |   xml   |  4  |  1  |
------------------------   -----------------------

现在我想编写一个查询,该查询将针对 213 值从表 A 中选择所有 sID 和 qID,并将这些 sID 和 fID 传递给表 B,并一一获取所有文本,如下面的输出所示。

--------------------------
| Text | sID | qID | fID |
--------------------------
| abc  |  1  |  1  | 213 |
| abc  |  1  |  2  | 213 |
| abc  |  1  |  3  | 213 |
| abc  |  2  |  1  | 213 |
| abc  |  2  |  2  | 213 |
| abc  |  2  |  3  | 213 |
--------------------------

我尝试了下面的代码。

SELECT s.territoryID, t.name, s.sectionName, s.attributeName, s.shopID, s.attributeID
FROM scoreanalysis AS s 
INNER JOIN territories AS t ON s.territoryID = t.ID 
WHERE  s.territoryID IN 
( 
  SELECT t.ID FROM territories as t 
  WHERE t.formatID = 213 and t.territorylevelID =349537 
  and t.lft > 2 and t.rht < 397
) 
AND s.achievedScore =0 AND s.applicableScore !=0

SELECT questionComment from comments where 
shopID=".$row["shopID"]." and questionID=".$row["attributeID"]

有什么办法可以解决这个问题!有什么帮助吗?提前致谢

【问题讨论】:

  • 文本栏在哪里?在哪个表中?
  • 粘贴你尝试过的内容
  • text 列在 B 表中。 @Naveen
  • @Gunaseelan 我首先尝试根据 213 计算 sID 并保存在数组中,然后根据 sID 数组的计数计算 qID。它给了我想要的实际结果,但需要很多时间(由于数据量大)我想减少时间,或者说在单个查询中优化它而不是两个。
  • @Gunaseelan SELECT s.territoryID, t.name, s.sectionName, s.attributeName, s.shopID, s.attributeID FROM scoreanalysis AS s INNER JOIN regions AS t ON s.territoryID = t. ID WHERE s.territoryID IN(从区域中选择 t.ID 为 t WHERE t.formatID = 213 and t.territorylevelID =349537 and t.lft > 2 and t.rht

标签: mysql sql select join where


【解决方案1】:

您可以将两个表连接在一起,并添加以下条件:

  • sID 匹配
  • qID 匹配
  • tableA.fID 为 213

在您的选择中,您可以从 tableB 中提取 text、sid 和 qid 值,以及从 tableA 中提取 fid,如下所示:

SELECT b.xmlText, b.sid, b.qid, a.fid
FROM tableA a
JOIN tableB b ON b.sid = a.sid AND b.qid = a.qid AND a.fid = 213;

【讨论】:

  • 如果不是 1:1 关系,这会给你重复的答案
【解决方案2】:

SQL 查询:

SELECT `qID`,`sID`, `xmlText` AS `text` 
FROM `B` 
WHERE EXISTS (
    SELECT `sID`, `qID`, `fID` , `id` 
    FROM `a`  
    WHERE a.sID = B.sID 
        AND a.qID=B.qID 
        AND fID=213
)

【讨论】:

    【解决方案3】:
    SELECT b.xmlText as Text, a.sID, a.qID, a.fID 
      FROM a, b 
      WHERE a.sID = b.sID and a.qID = b.qID AND a.fID = 213;
    

    这会给你输出

    --------------------------
    | Text | sID | qID | fID |
    --------------------------
    | xml  |  1  |  1  | 213 |
    | xml  |  1  |  2  | 213 |
    | xml  |  1  |  3  | 213 |
    | xml  |  2  |  1  | 213 |
    | xml  |  2  |  2  | 213 |
    | xml  |  2  |  3  | 213 |
    --------------------------
    

    【讨论】:

      【解决方案4】:

      试试这个:

      SELECT b.text, a.sid, a.qid, a.fid
      FROM a
      LEFT OUTER JOIN b ON a.sID = b.sID AND a.qID = b.qID 
      WHERE a.fID = 213;
      

      【讨论】:

        【解决方案5】:

        exists 运算符应该可以解决问题:

        SELECT `text`
        FROM   b
        WHERE  EXISTS (SELECT *
                       FROM   a
                       WHERE  a.sID = b.sID and a.qID = b.qID AND fID = 213)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-06
          • 1970-01-01
          相关资源
          最近更新 更多