0

少し奇妙な問題があります。次の SQL を調べてください。

CREATE TABLE `tablea` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `name` VARCHAR( 60 ) NOT NULL
) ENGINE = MYISAM ;

CREATE TABLE `tableb` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `name` VARCHAR( 60 ) NOT NULL ,
    `refid` INT NOT NULL ,
    `position` INT NOT NULL
) ENGINE = MYISAM ;

INSERT INTO tablea (`id`,`name`) VALUE (1,'a'),(2,'b'),(3,'c');
INSERT INTO tableb (`name`, `refid`, `position`) VALUE ('a', 1, 2),('b', 1, 1);
INSERT INTO tableb (`name`, `refid`, `position`) VALUE ('a', 2, 1),('b', 2, 2);

tableb は、tablea を参照する 0 以上の行を保持します。tablea のレコードと、最も低い (MIN) 位置を持つ tableb のレコードをリコールしたいと考えています。したがって、現時点ではこれは単純な SQL です。

SELECT 
    a.id, 
    a.name AS namea,
    b.name AS nameb,
    GROUP_CONCAT(b.name),
   CAST(group_concat(b.position) AS CHAR )
FROM tablea AS a
LEFT JOIN tableb AS b
    ON b.refid=a.id
GROUP BY a.id
ORDER BY b.position ASC

これを実行すると、出力が表示されます

id  namea   nameb   concat  concat
3   c   NULL    NULL    NULL
1   a   b   b,a 1,2
2   b   b   b,a 2,1

1 行目と 2 行目は正しいですが、3 行目は nameb が b ではなく a であると予想していました。私はMINで遊んでみましたが、私が期待しているものを常に返すものを手に入れることができません。助けていただければ幸いです。現時点では、2つのクエリを実行するだけです:(

4

1 に答える 1

4
SELECT 
    a.id, 
    a.name AS namea,
    b.name AS nameb,
FROM tablea AS a
LEFT JOIN tableb AS b
    ON b.refid=a.id AND b.position = (SELECT min(position) FROM tableb b2 WHERE b2.rf_id = a.id)
于 2011-08-26T17:24:34.767 に答える