Оператор SQL с PHP - выберите последнюю добавленную строку от каждого поставщика - PullRequest
1 голос
/ 18 января 2012

Этот вопрос, вероятно, легко решить, но вот он.

Я хотел бы получить последние данные от каждого поставщика (последняя строка вставлена ​​в базу данных для каждого поставщика).

Это пример данных из MySQL:

id  vendorId  vendor   url          delay   price0   price1   price2   price3   price4   price5   price6     date
1   1         vendor1  vendor1.com    0       12       15       18       14       25       28       25       2012-01-18 09:43:40
2   2         vendor2  vendor2.com    0       12       15       18       14       25       28       25       2012-01-18 09:43:40
3   1         vendor1  vendor1.com    0       15       17       122      12       30       52       53       2012-01-18 10:02:40
4   2         vendor2  vendor2.com    0       13       12       123      16       54       61       91       2012-01-18 10:02:40

Я бы хотел, чтобы результат был:

id  vendorId  vendor   url          delay   price0   price1    price2   price3   price4   price5   price6     date
3   1         vendor1  vendor1.com    0       15       17       122       12       30       52       53       2012-01-18 10:02:40
4   2         vendor2  vendor2.com    0       13       12       123       16       54       61       91       2012-01-18 10:02:40

Каким был бы SQL и как бы я поместил значения в этот массив?

$vendor = array(
       array('vendorId' => '1', 'vendor' => 'vendor1', 'url' => 'vendor1', 'delay' => 0, 'price0' => 12, 'price1' => 15, 'price2' => 26, 'price3' => 14, 'price4' => 25, 'price5' => 64, 'price6' => 512),
       array('vendorId' => '2', 'vendor' => 'vendor2', 'url' => 'vendor2', 'delay' => 0, 'price0' => 12, 'price1' => 15, 'price2' => 26, 'price3' => 14, 'price4' => 25, 'price5' => 64, 'price6' => 512)
);

Заранее спасибо

Кроме того, я забыл упомянуть: в базе данных будет больше, чем 2 продавца, поэтому я бы предпочел, чтобы их подбирали по каждому авто.

Ответы [ 5 ]

1 голос
/ 18 января 2012

Попробуйте ниже:

select * from vendor_table_name as ts 
left join 
(select max(id) as id from vendor_table_name group by vendorId) as tsm
on ts.id=tsm.id

Однако он имеет предел, после которого он будет медленным примерно после 50K - 80K строк

Лучший способ - сделать просмотр последних записей и объединиться с представлением.

как показано ниже:

  create view latestrecords as 
  select max(id) as id,vendorId from vendor_table_name group by vendorId

и присоединяйтесь к представлению:

  select * from vendor_table_name as ts 
    left join 
    latestrecords  as tsm
    on ts.id=tsm.id
1 голос
/ 18 января 2012

Не уверен, что синтаксис правильный, но примерно так я и сделал бы.

SELECT 
    `id`, `vendorId`, `vendor`, `url`, `delay`, `price0`, 
    `price1`, `price2`, `price3`, `price4`, `price5`, 
    `price6`, `date` 
FROM 
    `vendor_table_name` 
GROUP BY 
    `vendor_id` 
HAVING 
    `date` = max(`date`)
1 голос
/ 18 января 2012
SELECT max( id ) AS max_id, vendorId, url, delay, 
price0, price1, price2, price3, price4, price5, price6, date 
FROM `vendors` 
GROUP BY vendorId

Вы обновили свой вопрос тем, как вы должны получить набор результатов в массив.См. Здесь: http://php.net/manual/en/function.mysql-fetch-array.php

$row = mysql_fetch_array($result);

Затем вы сможете добавить каждую строку в качестве ассоциативного массива в другой массив, содержащий всех ваших поставщиков, доступных по ключу / значению.

1 голос
/ 18 января 2012

Попробуйте этот запрос -

SELECT v1.* FROM vendors v1
  JOIN (
    SELECT vendorId, MAX(date) date FROM vendors GROUP BY vendorId
  ) v2
ON v1.vendorId = v2.vendorId AND v1.date = v2.date
0 голосов
/ 18 января 2012

Попробуйте это

SELECT * FROM vendor_table_name ORDER BY date DESC

Для массива

$result =  (query result)

foreach($result as $r){
     $array = array("name" => $r->name, .....);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...