0

SQLクエリであなたの助けが必要です.

数学要素の順序が最も小さいテーブルで選択値が必要です。現在、次の Query があります。

SELECT p.confirmation,
  p.lname,
  p.fname,
  p.profiletype,
  a.address1,
  a.city,
  c.contactinfo
FROM profile p
LEFT JOIN contact c
  ON p.confirmation = c.profileid
  AND c.ord = 1
LEFT JOIN address a
  ON p.confirmation = a.profileid
  AND a.ord =1

これは、最も小さい「a.ord」または「c.ord」が 1 の場合にうまく機能します。ただし、最小値は常に 1 であるとは限らず、他の数字である可能性があるため、成功せずに次のことを試しました。

SELECT p.confirmation,
  p.lname,
  p.fname,
  p.profiletype,
  a.address1,
  a.city,
  c.contactinfo
FROM profile p
LEFT JOIN contact c
  ON p.confirmation = c.profileid
  min(c.ord)
LEFT JOIN address a
  ON p.confirmation = a.profileid
  min(a.ord)

「AND a.ord =1」を「min(a.ord)」に置き換えましたが、成功しませんでした..

2 つの別々のクエリを作成せずにどうすればよいでしょうか。

のようなものを追加できる方法はありますか

SELECT c.ord FROM contact c WHERE p.confirmation = c.profileid ORDER BY c.ord LIMIT 1

現在のSQLの中に?

ありがとう!

4

5 に答える 5

1

各テーブルの最小順序を計算し、それを結合で使用することでそれを行うことができます。

SELECT p.confirmation, p.lname, p.fname, p.profiletype,
       a.address1, a.city, c.contactinfo
FROM profile p LEFT JOIN
     (select c.profileid, MIN(c.ord) as minord
      from contact c
      group by c.profileid
     ) minco
     on minco.profileid = c.profileid left join
     contact c
     ON p.confirmation = c.profileid and minco.minord = c.ord LEFT JOIN
     (select a.profileid, min(a.ord) as minord
      from address a
      group by a.profileid
     ) minao
     on minao.profileid = c.profileid left join
     address a
     ON p.confirmation = a.profileid and minao.minord = a.ord
于 2013-03-26T19:20:40.867 に答える
0

アップデート:

私はネストされた SELECT で私の問題を最終的に解決しました:

SELECT p.confirmation,
        p.lname,
        p.fname,
        p.profiletype,
        a.address1,
        a.city,
        c.contactinfo
    FROM profile p
    LEFT JOIN contact c
        ON p.confirmation = c.profileid
        AND c.ord=(SELECT ord FROM contact WHERE profileid= p.confirmation ORDER BY ord LIMIT 1)
    LEFT JOIN address a
        ON p.confirmation = a.profileid
        AND a.ord=(SELECT ord FROM address WHERE profileid= p.confirmation ORDER BY ord LIMIT 1)

1 つのクエリで複数選択を使用する方法について洞察を提供してくれた #Gordon Linoff に感謝します。

于 2013-03-27T00:57:04.503 に答える
0

このようなものがあなたが探しているものかもしれません。ORDER BY c.ord ASC, a.ord ASC必要な優先度にORDER BY a.ord ASC, c.ord ASC応じて変更できます。

SELECT p.confirmation,
    p.lname,
    p.fname,
    p.profiletype,
    a.address1,
    a.city,
    c.contactinfo
FROM profile p
LEFT JOIN contact c
    ON p.confirmation = c.profileid
LEFT JOIN address a
    ON p.confirmation = a.profileid
ORDER BY c.ord ASC, a.ord ASC
LIMIT 1
于 2013-03-26T19:24:48.483 に答える
0
  AND a.ord =1 // if a.cord is always 1
  AND a.ord <=1 // if a.cord is always <1 (eg. .9 or .75) 
  // or just leave it.. i dont know your script, but is it needed?
  // same at c.cord!
  // but rather use where! see below

そして例として:

SELECT 
    p.confirmation, 
    p.lname, 
    p.fname, 
    p.profiletype, 
    a.address1, 
    a.city, 
    c.contactinfo 
FROM  
    profile AS p 
LEFT JOIN 
    contact AS c 
ON 
    p.confirmation=c.profileid 
LEFT JOIN 
    address AS a 
ON 
    p.confirmation=a.profileid 
WHERE 
    c.ord=1 AND a.ord=1 
ORDER BY 
    c.ord ASC, a.ord ASC

問題が解決したことを願っています

于 2013-03-26T19:17:06.417 に答える
0

注文後に最初の行を取得するには、MySQL で LIMIT 1 を使用するだけです。

SELECT p.confirmation,
  p.lname,
  p.fname,
  p.profiletype,
  a.address1,
  a.city,
  c.contactinfo
FROM profile p
LEFT JOIN contact c
  ON p.confirmation = c.profileid
LEFT JOIN address a
  ON p.confirmation = a.profileid
ORDER BY c.ord, a.ord
LIMIT 1
于 2013-03-26T19:22:56.590 に答える