9

カテゴリと画像の2つのテーブルがあります。ここで、Category.ID == Images.Category

カテゴリー

-----------------------
| ID | parent | name  |
-----------------------
| 1  | 1      | foo   |
| 2  | 1      | bar   |
| 3  | 2      | lorem |
-----------------------

画像

--------------------------------------
| ID  | category    | url            |
--------------------------------------
| 1   | 1           | foo.jpg        |
| 2   | 2           | bar.jpg        |
| 3   | 1           | foo2.jpg       |
--------------------------------------

MySQLクエリを試しました

SELECT *
FROM `category`
INNER JOIN
(SELECT MAX(ID) , url, category FROM `images` GROUP BY `category`)
AS a ON category.ID = a.category
WHERE `parent` = '1'

結果は

-------------------------------------------
| ID | parent | name  | url     | max(ID) |
-------------------------------------------
| 1  | 1      | foo   | foo.jpg | 3       |
| 2  | 1      | bar   | bar.jpg | 2       |
-------------------------------------------

問題は

ここに最後に追加された行のURLが必要ですが、最初の行と同様に、url = foo2.jpgおよびmax(ID)= 3の代わりに、foo.jpgになります。クエリの問題がわかりません。

最後の行を取得するためにmax(ID)を使用します。これにより、max(ID)の正しい最後の行が得られますが、適切なURL列は得られません。

4

2 に答える 2

14

代わりにこれを試してください:

SELECT *
FROM `category`   AS c
INNER JOIN images AS i ON i.category = c.id
INNER JOIN
(
    SELECT  category, MAX(ID) AS MAXId
    FROM `images` 
    GROUP BY `category`
)AS a  ON i.category = a.category
      AND i.ID       = a.MaxID
WHERE c.`parent` = '1';

SQL フィドルのデモ

問題は、集計関数にも句にも含まれていないGROUP BY categoryサブクエリと選択の中にいたため、MySQL がこれらの列の任意の値を取得することです。そのため、一貫した結果が得られました。MAX(ID) , url, categoryGROUP BY

これを解決するにはJOIN、2 つのテーブルcategoryと通常は、同じテーブルのwithを計算するテーブルとサブクエリimagesの間に追加の結合を追加します。次に、このサブクエリを、 max = 元の結合条件でテーブルに結合します。imagesMAX(id)GROUP BY categoryimagesimagesidid

これにより、最後の の画像の詳細のみが表示されますid

于 2013-03-20T06:44:50.623 に答える
1

より短い方法で

SELECT c.id,c.parent,c.name, MAX(c.ID) , url, category
    FROM `category` c
    INNER JOIN Images i on c.id=i.id and 
     c.id=(select max(id) from category)

このクエリはあなたのために働くと思います..SQLフィドルでテストされています.このリンクで. http://sqlfiddle.com/#!2/5fe63/36

解決したら教えて

于 2013-03-20T07:09:59.397 に答える