-1

我在从 MySql 表中查找数据时遇到问题。

表 A:

+-------+-------------+------+-----+-------------------+-------+
| ID    | Table_b_fk  |Value | age | name              | score |
+-------+-------------+------+-----+-------------------+-------+
| 01    | 01          | 255  |  21 | Tom               |  65   | 
| 02    | 02          | 36   |  20 | Peter             |  95   | 
| 03    | 03          | 25   |  22 | John              |  65   | 
| 04    | 04          | 36   |  20 | Bond              |  95   |<<----First 
| 05    | 05          | 258  |  22 | Smith             |  65   | 
| 06    | 06          | 420  |  20 | Robert            |  95   | 
| 07    | 07          | 258  |  22 | Nisarg Patel      |  65   | 
| 08    | 08          | 16   |  21 | Peter             |  95   | 
| 09    | 09          | 25   |  23 | J0k               |  65   | 
| 10    | 10          | 36   |  22 | Prodigitalson     |  95   | 
| 11    | 11          | 205  |  22 | Silver            |  65   |<<----Next
| 12    | 12          | 37   |  20 | Json              |  95   | 
| 13    | 13          | 285  |  23 | Villa             |  65   | 
| 14    | 14          | 36   |  22 | Parker            |  95   | 
+-------+-------------+------+-----+-------------------+-------+

表 B:

+-------+-------------+------+-----+-------------------+-------+
| ID    | Result      | M1   |  M2 | name              | score |
+-------+-------------+------+-----+-------------------+-------+
| 01    | Pass        | 30   |  26 | Tom               |  65   | 
| 02    | Pass        | 30   |  20 | Peter             |  95   | 
| 03    | Pass        | 25   |  60 | John              |  65   | 
| 04    | Pass        | 100  | 100 | Bond              |  95   |<<----First 
| 05    | Pass        | 55   |  65 | Smith             |  65   | 
| 06    | Pass        | 80   |  95 | Robert            |  95   | 
| 07    | Pass        | 65   |  75 | Nisarg Patel      |  65   | 
| 08    | Pass        | 56   |  71 | Peter             |  95   | 
| 09    | Pass        | 90   |  96 | J0k               |  65   | 
| 10    | Pass        | 96   |  96 | Prodigitalson     |  95   | 
| 11    | Pass        | 100  | 100 | Silver            |  65   |<<----Next
| 12    | Pass        | 47   |  92 | Json              |  95   | 
| 13    | Pass        | 82   |  73 | Villa             |  65   | 
| 14    | Pass        | 86   |  72 | Parker            |  95   | 
+-------+-------------+------+-----+-------------------+-------+

我正在加入 TableA 和 TableB,其中 TableATable_b_fk是 TableB 的外键。

我正在查找与 TableB 列匹配的记录M1 & M2 = 100

我的场景:1

我知道匹配记录 ID 的第一次出现:04TableA. 我想做一个搜索来找到下一条记录M1 & M2 = 100。(记录 Id-11)但搜索不应从01开始。它应该从最后找到的记录 ID 开始。也就是说,从O4开始,搜索应该开始查找下一个出现的记录。

我的尝试:我尝试使用 Limit 进行查找,但没有帮助我找到。有人可以帮助我吗?

编辑:1

我的场景: 2 在我的第二种情况下,我的 TableB 重复了 Data,并且 ID 在 TableA 中是外来的。我怎样才能找到记录。? 具有匹配的 ID/M1/M2 值:我找到了解决方案。我只想找到当前记录的 FOREIGN KEY 并检查同一张表中下一次出现的记录,我可以得到下一条记录吗?

在这种情况下,我的 TableB 记录与 TableA 记录不同。换句话说,我的 TableA 记录将指向 tableA。多对一。这是仪式吗?

编辑:2

感谢您的所有努力和知识,我找到了方案的解决方案:2 检查它:

CREATE TABLE TableB (
  ID Int,
  Result VARCHAR(20),
  M1 INT,
  M2 INT,
  name VARCHAR(20),
  Score INT);

INSERT INTO TableB VALUES
( 11    , 'Pass'        , 30   ,  26 , 'Tom'               ,  65   ), 
( 13    , 'Pass'        , 30   ,  20 , 'Peter'             ,  95   ),
( 80    , 'Pass'        , 25   ,  60 , 'John'              ,  65   ),
( 81    , 'Pass'        , 100  , 100 , 'Bond'              ,  95   ),
( 90    , 'Pass'        , 55   ,  65 , 'Smith'             ,  65   ),
( 96    , 'Pass'        , 80   ,  95 , 'Robert'            ,  95   ),
( 97    , 'Pass'        , 65   ,  75 , 'Nisarg Patel'      ,  65   ),
( 98    , 'Pass'        , 56   ,  71 , 'Peter'             ,  95   ),
( 99    , 'Pass'        , 90   ,  96 , 'J0k'               ,  65   ),
( 100    , 'Pass'        , 96   ,  96 , 'Prodigitalson'     ,  95   ),
( 101    , 'Pass'        , 10  , 10 , 'Silver'            ,  65   ),
( 103    , 'Pass'        , 47   ,  92 , 'Json'              ,  95   ),
( 201    , 'Pass'        , 82   ,  73 , 'Villa'             ,  65   ), 
( 222    , 'Pass'        , 86   ,  72 , 'Parker'            ,  95   )
;


CREATE TABLE TableA
    (`ID` int, `Table_b_fk` int, `Value` int, `age` int, `name` varchar(13), `score` int)
;

INSERT INTO TableA
    (`ID`, `Table_b_fk`, `Value`, `age`, `name`, `score`)
VALUES
    (01, 11, 255, 21, 'Tom', 65),
    (02, 81, 36, 20, 'Peter', 95),
    (03, 80, 25, 22, 'John', 65),
    (04, 97, 36, 20, 'Bond', 95),
    (05, 81, 258, 22, 'Smith', 65),
    (06, 06, 420, 20, 'Robert', 95),
    (07, 81, 258, 22, 'Nisarg Patel', 65),
    (08, 08, 16, 21, 'Peter', 95),
    (09, 96, 25, 23, 'J0k', 65),
    (10, 101, 36, 22, 'Prodigitalson', 95),
    (11, 222, 205, 22, 'Silver', 65),
    (12, 12, 37, 20, 'Json', 95),
    (13, 201, 285, 23, 'Villa', 65),
    (14, 101, 36, 22, 'Parker', 95)
;

解决方案是:

SELECT a.id  
FROM TableB b
INNER JOIN TableA a 
ON a.Table_b_fk = b.id
WHERE M1 = 100 and M2 = 100  AND a.ID>4 limit 1

其中限制只是限制下一条记录..(答案是 5)。

我的情况Doctrine 2:使用下面的查询代码。

$qry = $this->manager()->createQueryBuilder()
        ->select(array('e', 's'))
        ->from('YOUR_DOMAIN', 'e')
        ->Join('e.table_b_k', 's')
        ->where("s.m1 = ?", $valueone)
        ->andwhere("s.m2 = ?", $valuetwo)
        ->andwhere("e.id > ?", $currentrecord)
        ->setMaxResult(1);

注意:YOUR_DOMAIN这里是表A。TableA 和 TableB 应该通过 Mapping 连接,所以我们不需要在查询中加入/引用。直接作为 TableB。这将由上面示例中的第二行 Join 完成。目前还没有测试。

4

4 回答 4

1

我正在查找与 TableB 列 M1 和 M2 = 100 匹配的记录。

假设你的意思是:

我正在查找与 TableB 列 M1 = 100 AND M2 = 100 匹配的tableA记录。

SELECT *
FROM table_a a
WHERE EXISTS (
   SELECT *
   FROM table_b b
   WHERE b.id = a.tableb_fk
   AND b.m1 = 100 AND b.m2 = 100
   );

更新:由于 OP 似乎想要抑制结果中的第一个匹配记录(我假设:具有最低 id 的记录),因此可以在 WHERE 子句中添加一个额外的 EXIST 以抑制第一个匹配:

SELECT *
FROM table_a a
WHERE EXISTS (
   SELECT *
   FROM table_b b
   WHERE b.id = a.tableb_fk
   AND b.m1 = 100 AND b.m2 = 100
   AND EXISTS (
       SELECT *
       FROM table_b bb
       WHERE bb.id < b.id
       AND bb.m1 = 100 AND bb.m2 = 100
       )
   );
于 2013-06-30T10:10:42.060 回答
1

如果我正确理解您的问题,我认为您正在寻找这个:

SET @id:=4;

SELECT *
FROM TableA
WHERE Table_b_fk =
    (SELECT MIN(ID)
     FROM TableB
     WHERE (M1,M2) = (SELECT M1, M2 FROM TableB WHERE ID=@id)
           AND ID>@id)

此查询将从 TableA 中选择第二个表中 M1=100 和 M2=100 的第二行。

于 2013-06-30T08:39:35.673 回答
1

这个怎么样试试看

SELECT b.id AS next_id FROM tableb b LEFT JOIN tablea a 
ON (b.id =a.Table_b_fk ) WHERE b.M1=100 AND b.M2 =100 AND b.id >4 
ORDER BY b.id ASC  LIMIT 1

它给出了下一次出现 * M1 =100 和 M2 =100 *

请参阅小提琴示例 它返回11下一次出现 * M1 =100 和 M2 =100 *

于 2013-06-30T08:51:40.357 回答
1

尝试这个

SELECT a.id  
FROM TableB b
INNER JOIN TableA a 
ON a.Table_b_fk = b.id
WHERE M1 = 100 and M2 = 100  AND b.ID>4

输出:

 ID
 11

演示文件

于 2013-06-30T10:04:28.990 回答