2012-01-18 4 views
1

この質問はおそらく解決しやすいでしょうが、ここではそれがあります。PHPを使用したSQL文 - 各ベンダーから最新の追加行を選択してください

各ベンダーから最新のデータを入手したいと思います(ベンダーごとにデータベースに挿入された最新の行)。

これは、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業者以上になりますので、私は、彼らが自動ごとにピックアップされるだろうことを好むだろう。

答えて

1
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); 

あなたは、キー/値がアクセスできるすべてのベンダーを含む別の配列への連想配列として各行を追加することができます。

+0

ありがとう。ベンダーを自分の多次元配列に追加することについては、私が望むのと同じようにすべての値を得ています。{$ r = mysql_fetch_array($ result)} { } – estrar

+0

そこから、配列をベンダー配列に追加するのと同じように、中括弧{}内に以下を追加するだけです:$ vendor_array [ ] = $ r; – DevCoDesign

+0

すばらしい、ありがとう! :) – estrar

1

このクエリ試してみてください - 配列の場合、この

SELECT * FROM vendor_table_name ORDER BY date DESC 

を試してみてください

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 
-2

$result = (query result) 

foreach($result as $r){ 
    $array = array("name" => $r->name, .....); 
} 
あなたはあなたに結果セットを取得する方法であなたの質問を更新し
+1

これが唯一の日付順の情報を返しますが、各ベンダーのための唯一の最新のレコードを除外することはありません。 – iWantSimpleLife

1

構文が正しいかどうかはわかりませんが、これはおおよそのやり方です。

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

以下試してみてください。

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 
+0

ありがとうございます。あなたの例で私のmysqlクエリはどのように見えますか? – estrar

+0

気にしないでください。乾杯:) – estrar

関連する問題