2017-10-23 18 views
0

MySQLの設定に2つのテーブルがあります。 1つは材料で、もう1つはそれぞれの重量である。いくつかのマテリアルが更新されるたびに、ウェイトテーブルの別の行を追加してウェイトを更新し、ウェイトの変更を追跡します(タイムスタンプやものも含まれますが、以下の例では追加しません。簡単にするために)MySQLがエントリごとに1行だけを返すようにする

 Table "Weights"     Table "Materials" 
############################### ############################## 
# ID # MaterialID # Weight # # Code # Type # Size # Color # 
############################### ############################## 
# 1 #  46  # 456.4 # # 46 # B # 13 # Black # 
# 2 #  46  # 453.2 # # 47 # D # 11 # Green # 
# 3 #  47  # 231.1 # ############################## 
# 4 #  47  # 222.0 # 
############################### 

今、私は以下のようなクエリを実行した場合、私は材料を得ることができ、それが対応する重みです:。

SELECT Materials.Code, 
     Materials.Type, 
     Materials.Size, 
     Materials.Color, 
     Weights.Weight 
FROM 
     Materials 
INNER JOIN Weights ON Weights.MaterialID = Materials.Code 
WHERE Materials.Code = 46 
ORDER BY Weights.Code DESC 
LIMIT 1 

結果(これは、対応する材質に私の最後の重みを示して):

####################################### 
# Code # Type # Size # Color # Weight # 
# 46 # B # 13 # Black # 453.2 # 
####################################### 

これまでのところ、とても良いが、今...

私はLIMITと句を省略した場合、私は複数の行(それは非常に明白であるが、ここで私は今こだわっている)を取得:

####################################### 
# Code # Type # Size # Color # Weight # 
# 47 # D # 11 # Green # 231.1 # 
# 47 # D # 11 # Green # 222.0 # 
# 46 # B # 13 # Black # 453.2 # 
# 46 # B # 13 # Black # 456.4 # 
####################################### 

私の計画は、対応するマテリアルで最後に挿入したウェイトのみを取得することでした。一つの材料、1つの重量行については、そのよう:

####################################### 
# Code # Type # Size # Color # Weight # 
# 46 # B # 13 # Black # 453.2 # 
# 47 # D # 11 # Green # 222.0 # 
####################################### 

私はすでに、それは一つだけを選ぶだろうが、それは唯一の46である1行を、戻ってくることを期待し、Weights.WeightMIN()を入れてみました他のすべてを無視する。

私は無知で、インターネット上ですでに検索されていますが、答えが見つかっていますが、私のニーズに合わせてどのように対応できるかはわかりません。

ご協力いただきまして誠にありがとうございます。

を使用でき
+0

LEFT JOINを使用してください。 – saband

+0

@saband私はMySQLをよく理解していません(基本はそうですが、JOINとかそうではありません)。LEFT JOINを使って私を正しい方向に向けることができれば、非常に役に立ちます。 – Fusseldieb

+0

この過去の投稿をチェックすると、https://stackoverflow.com/questions/3491329/group-by-with-maxdateは基本的に同じ概念です。 – Nic3500

答えて

1

これは動作するはずです。 IDにフィルタを追加して、各マテリアルの最大IDと一致するIDのみを選択しました。

SELECT w.ID , m.Code, 
    m.Type, 
    m.Size, 
    m.Color, 
    w.Weight 
FROM 
    Materials m 
INNER JOIN Weights w ON w.MaterialID = m.Code 
AND 
w.ID IN(SELECT MAX(ID) FROM Weights i WHERE i.MaterialID = m.Code) 
+0

「してください」はありません。 ***良い答え***は、何が行われたのか、それがなぜOPのためだけでなく、将来の訪問者のためにそうした方法で行われたのかについての説明を常に持っています。 –

+0

聖なる牛、この複雑なことは実際に働く。ありがとう:) – Fusseldieb

0

mysqli_insert_id($接続)。

クエリの最後に挿入されたIDを取得します。これを使用して、他のマテリアルやウェイトにアクセスしたり、コードを作成する方法を選択したりできます。

など。

$latest_id = mysqli_insert_id($connection); 

$query ="SELECT whatever FROM wherever WHERE id = '{$latest_id}' "; 

その他、各種

+0

ええ、私は簡単に2つの別々のクエリでそれを行うことができます。 1つはMaterialテーブルから、もう1つはWeightsテーブルから押しますが、パフォーマンスは少し悪くなります。可能であれば、それを避けたいです。 – Fusseldieb

+0

それは公正な点です。しかし、それがミリ秒の半分の間で、働かないなら、私は前者を選ぶだろう。 – cmprogram

+0

良い点もありますが、1行ではなく、aproxです。ミリ秒の半分は150msの衝撃を与えます。それほど多くはありませんが、まだ... – Fusseldieb

関連する問題