不是相交(IN)而是一种。 Col第一行x与col b.Mysql相交

时间:2016-05-06 01:23:57

标签: mysql

我有一个矩阵表。 6列宽6行深。第一列按顺序编号为0,5,4,3,2,1。表中的第一行是0,1,2,3,4,5 像这样:

Column names   RM0 RM1 RM2 RM3 RM4 RM5        
                0   1   2   3   4  5
                5
                4
                3
                2
                1

每一行都有单词,即MEDIUMHIGHCRITICAL等。 我有一个用户填写的表单,要求他们在两个类别中给出1-5的评分。它们的选择对应于矩阵中的一个单词。那......所有......我需要能够从表中选择这样的东西:

SELECT FROM TBLX WHERE RM0=4 INTERSECTS WITH RM4

我看过IN,但到目前为止我看到的一切仍然要求你有另一个WHERE x = y部分。我可以将整个表转储到一个数组中以某种方式得到我之后的东西吗?如你所见,我在这方面毫无头绪。

2 个答案:

答案 0 :(得分:0)

您可以这样做:

SELECT CASE :b2
       WHEN 1 THEN t.rm1
       WHEN 2 THEN t.rm2
       WHEN 3 THEN t.rm3
       WHEN 4 THEN t.rm4
       WHEN 5 THEN t.rm5
       ELSE ''
       END   AS `the_word` 
  FROM TBLX t
 WHERE t.rm0 = :b1

我对桌面设计感到困惑。而且第一行更加困惑......如果你想把它纳入查询中,那将非常复杂。

就普通的关系设计而言,我们将其表示为每对值的行,每行都有一个单词。

 mymatrix

 x_rating  y_rating  the_word
 --------  --------  --------
        1         1  LOW
        1         2  LOW
        1         3  MEDIUM
        1         4  MEDIUM
        1         5  MEDIUM
        2         1  LOW
        2         2  MEDIUM
        2         3  MEDIUM
      ...        
        5         5  HIGH

获取“单词”的查询示例如下:

 SELECT mx.the_word
   FROM mymatrix mx
  WHERE mx.x_rating = :b1
    AND mx.y_rating = :b2

要将相同的查询模式与原始表一起使用,我们可以将原始表转换为mymatrix表,使用RM0 = 0行中RM1到RM5列的值作为y_rating值。执行此操作的SQL相当麻烦:

SELECT mx.the_word
  FROM (
         SELECT t1.rm0    AS x_rating
              , s1.rm1    AS y_rating
              , t1.rm1    AS the_word
           FROM mytable t1
           JOIN mytable s1
             ON s1.rm0 = 0
            AND t1.rm0 > 0
          UNION ALL
         SELECT t2.rm0    AS x_rating
              , s2.rm1    AS y_rating
              , t2.rm1    AS the_word
           FROM mytable t2
           JOIN mytable s2
             ON s2.rm0 = 0
            AND t2.rm0 > 0
          UNION ALL
         SELECT t3.rm0    AS x_rating
              , s3.rm1    AS y_rating
              , t3.rm1    AS the_word
           FROM mytable t3
           JOIN mytable s3
             ON s3.rm0 = 0
            AND t3.rm0 > 0
          UNION ALL
         SELECT t4.rm0    AS x_rating
              , s4.rm1    AS y_rating
              , t4.rm1    AS the_word
           FROM mytable t4
           JOIN mytable s4
             ON s4.rm0 = 0
            AND t4.rm0 > 0
          UNION ALL
         SELECT t5.rm0    AS x_rating
              , s5.rm1    AS y_rating
              , t5.rm1    AS the_word
           FROM mytable t5
           JOIN mytable s5
             ON s5.rm0 = 0
            AND t5.rm0 > 0
       ) mx
WHERE mx.x_rating = :b1
  AND mx.y_rating = :b2 

答案 1 :(得分:0)

我最终采取了不同的路线。我仍然使用矩阵表,但是当我需要检索信息时,我没有尝试访问,而是查询了一次表,获取了所有信息并将其放入如下数组中:

    sql = "SELECT * FROM `tblriskmatrix`";
    if (!$conn->query($sql)) {
    echo "query failed: (" . $conn->errno . ") " . $conn->error;
    }
   $result = $conn->query($sql);

   $arrayOfMatrix = array();
   while ($row = $result->fetch_assoc()) {

    $arrayOfMatrix[] = $row;
   }
然后我将数组放入一个像这样的会话变量中:

    $_SESSION['arrayOfMatrix'] = $arrayOfMatrix;
然后我创建了一些函数来获取按键并将它们传递给另一个执行ajax调用的函数,传递按下这些变量的按键脚本的变量并将它们传递给我的会话变量并返回所需的结果。像这样:

    session_start();
    $a = $_GET['var_a'];
    $b = $_GET['var_b'];

   $response = array('response' => $_SESSION['arrayOfMatrix'][$a]["RM$b"]);
  echo json_encode($response);

然后将响应传递给表单元素并显示。因此,将会话变量中的矩阵表作为数组,我可以轻松地提取列y中第x行单元格内容。不确定它是否是技术上最正确的路线,但它有效。