Как выбрать самую свежую запись с групировкой по полю

xaoc2

Есть таблица:
+-------------+------------+---------------------+--------+-------------+
| supplier_id | product_id | date | price | charge_from |
+-------------+------------+---------------------+--------+-------------+
| <b>3</b> | <b>1</b> | <b>2006</b>-<b>11</b>-<b>15</b> <b>04</b>:<b>55</b>:<b>27</b> | <b>626</b>.<b>64</b> | product |
| <b>3</b> | <b>1</b> | <b>2006</b>-<b>11</b>-<b>28</b> <b>05</b>:<b>17</b>:<b>49</b> | <b>625</b>.<b>9</b> | product |
| <b>3</b> | <b>1</b> | <b>2006</b>-<b>12</b>-<b>04</b> <b>06</b>:<b>04</b>:<b>50</b> | <b>610</b>.<b>5</b> | product |
| <b>3</b> | <b>1</b> | <b>2006</b>-<b>12</b>-<b>12</b> <b>02</b>:<b>04</b>:<b>23</b> | <b>611</b>.<b>24</b> | product |
| <b>3</b> | <b>1</b> | <b>2006</b>-<b>12</b>-<b>14</b> <b>08</b>:<b>04</b>:<b>37</b> | <b>604</b>.<b>64</b> | product |
| <b>3</b> | <b>1</b> | <b>2006</b>-<b>12</b>-<b>19</b> <b>10</b>:<b>04</b>:<b>37</b> | <b>596</b>.<b>56</b> | product |
| <b>3</b> | <b>1</b> | <b>2006</b>-<b>12</b>-<b>19</b> <b>12</b>:<b>04</b>:<b>13</b> | <b>583</b>.<b>74</b> | product |
| <b>3</b> | <b>1</b> | <b>2007</b>-<b>01</b>-<b>08</b> <b>04</b>:<b>05</b>:<b>54</b> | <b>548</b>.<b>9</b> | product |
| <b>3</b> | <b>1</b> | <b>2007</b>-<b>01</b>-<b>09</b> <b>04</b>:<b>05</b>:<b>11</b> | <b>583</b>.<b>74</b> | product |
| <b>3</b> | <b>1</b> | <b>2007</b>-<b>01</b>-<b>16</b> <b>04</b>:<b>05</b>:<b>26</b> | <b>548</b>.<b>9</b> | product |
| <b>3</b> | <b>1</b> | <b>2007</b>-<b>01</b>-<b>17</b> <b>04</b>:<b>05</b>:<b>39</b> | <b>583</b>.<b>74</b> | product |
| <b>3</b> | <b>1</b> | <b>2007</b>-<b>01</b>-<b>18</b> <b>06</b>:<b>24</b>:<b>21</b> | <b>597</b>.<b>66</b> | product |
| <b>3</b> | <b>1</b> | <b>2007</b>-<b>01</b>-<b>29</b> <b>08</b>:<b>06</b>:<b>49</b> | <b>589</b>.<b>24</b> | product |
| <b>3</b> | <b>1</b> | <b>2007</b>-<b>01</b>-<b>30</b> <b>06</b>:<b>06</b>:<b>11</b> | <b>556</b>.<b>24</b> | product |
| <b>3</b> | <b>1</b> | <b>2007</b>-<b>03</b>-<b>01</b> <b>06</b>:<b>11</b>:<b>18</b> | <b>553</b>.<b>66</b> | product |
| <b>3</b> | <b>1</b> | <b>2007</b>-<b>03</b>-<b>27</b> <b>20</b>:<b>28</b>:<b>10</b> | <b>514</b>.<b>8</b> | product |
| <b>3</b> | <b>2</b> | <b>2006</b>-<b>11</b>-<b>15</b> <b>04</b>:<b>55</b>:<b>27</b> | <b>635</b>.<b>44</b> | product |
| <b>3</b> | <b>2</b> | <b>2006</b>-<b>11</b>-<b>28</b> <b>05</b>:<b>17</b>:<b>49</b> | <b>634</b>.<b>7</b> | product |
| <b>3</b> | <b>2</b> | <b>2006</b>-<b>12</b>-<b>12</b> <b>02</b>:<b>04</b>:<b>23</b> | <b>635</b>.<b>44</b> | product |
| <b>3</b> | <b>2</b> | <b>2006</b>-<b>12</b>-<b>12</b> <b>04</b>:<b>04</b>:<b>39</b> | <b>632</b>.<b>86</b> | product |
| <b>3</b> | <b>2</b> | <b>2006</b>-<b>12</b>-<b>14</b> <b>08</b>:<b>04</b>:<b>37</b> | <b>631</b>.<b>04</b> | product |
| <b>3</b> | <b>2</b> | <b>2006</b>-<b>12</b>-<b>19</b> <b>12</b>:<b>04</b>:<b>13</b> | <b>596</b>.<b>94</b> | product |
| <b>3</b> | <b>3</b> | <b>2006</b>-<b>11</b>-<b>15</b> <b>04</b>:<b>55</b>:<b>27</b> | <b>745</b>.<b>06</b> | product |
| <b>3</b> | <b>3</b> | <b>2006</b>-<b>11</b>-<b>28</b> <b>05</b>:<b>17</b>:<b>49</b> | <b>724</b>.<b>9</b> | product |
| <b>3</b> | <b>3</b> | <b>2006</b>-<b>12</b>-<b>04</b> <b>06</b>:<b>04</b>:<b>50</b> | <b>744</b>.<b>7</b> | product |
| <b>3</b> | <b>3</b> | <b>2006</b>-<b>12</b>-<b>12</b> <b>02</b>:<b>04</b>:<b>23</b> | <b>745</b>.<b>06</b> | product |
| <b>3</b> | <b>3</b> | <b>2006</b>-<b>12</b>-<b>12</b> <b>04</b>:<b>04</b>:<b>39</b> | <b>741</b>.<b>76</b> | product |
| <b>3</b> | <b>3</b> | <b>2006</b>-<b>12</b>-<b>14</b> <b>08</b>:<b>04</b>:<b>37</b> | <b>739</b>.<b>56</b> | product |
| <b>3</b> | <b>3</b> | <b>2006</b>-<b>12</b>-<b>19</b> <b>12</b>:<b>04</b>:<b>13</b> | <b>740</b>.<b>66</b> | product |
| <b>3</b> | <b>3</b> | <b>2007</b>-<b>01</b>-<b>18</b> <b>06</b>:<b>24</b>:<b>21</b> | <b>705</b>.<b>46</b> | product |
| <b>3</b> | <b>3</b> | <b>2007</b>-<b>02</b>-<b>09</b> <b>04</b>:<b>06</b>:<b>47</b> | <b>676</b>.<b>5</b> | product |
| <b>3</b> | <b>3</b> | <b>2007</b>-<b>02</b>-<b>12</b> <b>04</b>:<b>08</b>:<b>04</b> | <b>705</b>.<b>46</b> | product |
| <b>3</b> | <b>3</b> | <b>2007</b>-<b>03</b>-<b>01</b> <b>06</b>:<b>11</b>:<b>18</b> | <b>688</b>.<b>6</b> | product |
+-------------+------------+---------------------+--------+-------------+
Как для каждого продукта(product_id) выбрать уникальною по столбцам( supplier_id ,product_id) строку :последнее обновление цены для конкретного поставщика (sipplier_id). Для этой таблицы это былобы:
+-------------+------------+---------------------+--------+-------------+
| supplier_id | product_id | date | price | charge_from |
+-------------+------------+---------------------+--------+-------------+
| <b>3</b> | <b>1</b> | <b>2007</b>-<b>03</b>-<b>27</b> <b>20</b>:<b>28</b>:<b>10</b> | <b>514</b>.<b>8</b> | product |
| <b>3</b> | <b>2</b> | <b>2006</b>-<b>12</b>-<b>19</b> <b>12</b>:<b>04</b>:<b>13</b> | <b>596</b>.<b>94</b> | product |
| <b>3</b> | <b>3</b> | <b>2007</b>-<b>03</b>-<b>01</b> <b>06</b>:<b>11</b>:<b>18</b> | <b>688</b>.<b>6</b> | product |
+-------------+------------+---------------------+--------+-------------+
Вот такой запрос правильно выводит дату последнего обновления цены:
SELECT supplier_id, product_id , MAX(date) as date FROM supplier2 GROUP BY supplier_id, product_id;
К сожалению я немогу добавить price после
MAX(date) as date
так как price выберается из другой строки .А этот запрос приводит к зависанию MySQL:
SELECT t1.supplier_id, t1.product_id , t1.date ,t1.price FROM supplier2 t1
WHERE
t1.date = (SELECT MAX(t2.date) FROM supplier2 t2 WHERE t1.product_id = t2.product_id)
GROUP BY supplier_id, product_id
Таблица содержит около 30000 строк
5 ответов

xaoc2

Не знаю точно... попробуйте:
SELECT supplier_id, product_id , date, price FROM supplier2 GROUP BY supplier_id, product_id, MAX(date)


xaoc2

johndes : SQL Error: Invalid use of group function


xaoc2

STFF - Задача на 1 000 000$


xaoc2

что такое STFF? :)


xaoc2

что такое STFF? :)
Тынц