1

我有以下选择语句:

  SELECT
    items.id,
    items.name AS item_name,
    items.tobuy,
    items.list_id,
    items.note,
    items.unit,
    MIN(NULLIF(packages.ppu, 0)) AS mppu,
    packages.price AS mprice,
    items._deleted
  FROM
    items
  INNER JOIN
    lists ON lists.id = items.list_id
  LEFT JOIN
    packages ON items.id = packages.item_id
  WHERE
    lists.user_id = 1 AND
    items._deleted = '0'
  GROUP BY
    items.id
  ORDER BY
    tobuy DESC,
    item_name

但我真正想要的是来自具有最低 ppu 的包的价格(不一定是最低价格的包)。

有任何想法吗?

样本记录:

表:项目:

id,  name,  tobuy, list_id, note, unit, _deleted
95,  test1, 1,     1,       null, null, 0
69,  test2, 1,     1,       null, null, 0
194, test3, 1,     1,       null, null, 0
162, test4, 1,     1,       null, null, 0

表:列出:

id, name,  user_id
1,  list1, 1

表:包:

id,  item_id, price, ppu
392, 95,      0,     0
117, 95,      13.49, 0.078
391, 95,      0,     0
386, 69,      0,     0
387, 69,      0,     0
388, 69,      0,     0
368, 194,     4.58,  0.138
18,  194,     3.38,  0.177
17,  194,     3.88,  0.144

结果应该是四个项目,包含以下信息:

id,  item_name,  tobuy, list_id, note, unit, mppu,  mprice, _deleted
95,  test1,      1,     1,       null, null, 0.078, 13.49,  0
69,  test2,      1,     1,       null, null, 0,     0,      0
194, test3,      1,     1,       null, null, 0.138, 4.58,   0
162, test4,      1,     1,       null, null, 0,     0,      0

请注意,项目 162 没有任何对应的包,但它仍然显示在列表中。这就是“LEFT JOIN”的原因

顺便说一句,“mppu”代表“每单位最低价格”

4

3 回答 3

0

你能试试左二吗: packages ON ( packages.item_id = items.id and select min(packages.ppu) from packages where item_id=item.id)

还要确保将 group by 更改为 items.id 未测试

于 2013-10-13T04:22:38.527 回答
0

使用 mysql,这是非常简单的。

按 ppn 排序并将组移动到外部查询

SELECT * FROM (
  SELECT
    items.id,
    items.name AS item_name,
    items.tobuy,
    items.list_id,
    items.note,
    items.unit,
    MIN(NULLIF(packages.ppu, 0)) AS mppu,
    packages.price AS mprice,
    items._deleted
  FROM items
  INNER JOIN lists
    ON lists.id = items.list_id
    AND lists.user_id = 1
  LEFT JOIN packages
    ON items.id = packages.item_id
  WHERE items._deleted = '0'
  ORDER BY
    ppm,
    tobuy DESC,
    item_name) x
GROUP BY
  id
于 2013-10-13T05:21:18.550 回答
0

以下工作可以得到我正在寻找的结果。

SELECT * FROM (  
  SELECT
    items.id,
    items.name AS item_name,
    items.tobuy,
    items.list_id,
    items.note,
    items.unit,
    NULLIF(packages.ppu, 0) AS mppu,
    packages.price AS mprice,
    items._deleted
  FROM
    items
  INNER JOIN
    lists ON lists.id = items.list_id
    AND lists.user_id = 1 
  LEFT JOIN
    packages ON packages.item_id = items.id
  WHERE
    items._deleted = '0'
  ORDER BY
    tobuy DESC,
    item_name,
    IFNULL(mppu, 999999)) x
GROUP BY
  x.id
ORDER BY
  tobuy DESC,
  item_name

感谢大家为我提供帮助。

于 2013-10-13T23:56:44.230 回答