从表中间搜索记录

时间:2013-06-30 08:35:33

标签: mysql sql database doctrine-orm

我在从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&amp;表B,其中TableA Table_b_fk是TableB的外键。

我找到了与TableB列M1 & M2 = 100匹配的记录。

我的情景:1

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

我的尝试: 我试图找到使用限制,但它没有帮助我找到。有人可以帮助我吗?

修改:1

我的情景:2 在我的第二种情况下,我的TableB重复了数据,并且在TableA中ID是外来的。我怎么能得到记录。 ?具有匹配的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这里是TableA。 TableA和TableB应该通过Mapping连接,所以我们不需要在QueryB中直接加入/引用..作为TableB。这将由上面的例子中的第二行加入完成。它目前尚未经过测试。

4 个答案:

答案 0 :(得分: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的第二行。

答案 1 :(得分: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 *

请参阅Fiddle Example ,下次出现时会返回11 * M1 = 100且M2 = 100 *

答案 2 :(得分: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

demo FIDLLE

答案 3 :(得分:1)

  

我找到的记录与TableB列M1&amp; M2 = 100。

假设你的意思是:

  

我发现 tableA 记录与TableB列M1 = 100和M2 = 100匹配。

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为最低的),可以添加一个额外的EXIST到WHERE子句以禁止第一个匹配:

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
       )
   );