簡體   English   中英

修改SQL MAX查詢以查找對應字段的值

[英]Amend SQL MAX Query to Find Corresponding Field's Value

我有以下查詢:

$imgDimensions_query = "SELECT MAX(imgWidth) maxWidth, MAX(imgHeight) maxHeight FROM (
    SELECT imgHeight, imgWidth FROM primary_images WHERE imgId=$imgId
    UNION 
    SELECT imgHeight, imgWidth FROM secondary_images WHERE primaryId=$imgId) as MaxHeight";

效果很好,但是我想知道如何為maxWidthmaxHeight值找到imgId列的值以及表名?

我想要這個的原因是我需要知道maxWidthmaxHeight值是否屬於數據庫中的同一項目。

我想知道是否可以通過修改當前的SQL查詢來實現?


理想的情況是,如果同時查詢maxWidthmaxHeight值,並且可以將布爾值設置為布爾值以輸出true如果maxWidthmaxHeight屬於同一條目(至少一次))。

我在想,由於primary_images的圖像數據與secondary_images的數據是唯一的(反之亦然),因此可以在每個查詢中設置一個布爾值,只要存在一個true ,就輸出true 那有意義嗎? 那可能嗎?


我設法將第二個查詢放在一起,該查詢使用第一個查詢中的maxWidthmaxHeight值來輸出包含兩個值的特定集合中的圖像數量。 我真正關心的是,如果 ,或者如果沒有滿足上述要求的一個或多個圖像,如此反復,一個布爾值會比總數更好。 如果您有想法修改以下內容以顯示布爾值而不是結果數,請告訴我!

我已經放心,兩個表中的最大條目數都在1000以下,使用兩個查詢而不是一個查詢不會導致命中速度加快。 如果您也這么認為,並且將這些查詢組合成一個荒謬的話,也請讓我知道。

第二個查詢:

$haveDimensions_query = "SELECT sum(rows) AS total_rows FROM (
    SELECT count(*) AS rows FROM primary_images WHERE imgId = $imgId and imgWidth = $maxImageWidth and imgHeight = $maxImageHeight
    UNION ALL
    SELECT count(*) AS rows FROM secondary_images WHERE primaryId = $imgId and imgWidth = $maxImageWidth and imgHeight = $maxImageHeight
) as union_table";

[原始答案在下面-這應該更好]

我想我誤會了你的問題。 以下查詢應給出一個結果集,該結果集包含與所有圖像相比具有最大高度或最大寬度的每個圖像的一行,並且該行將在該行中具有ID和表名以及高度和寬度。

由於最大高度和寬度可能並非來自同一圖像,因此結果中不一定只有一行具有單個圖像ID和表格源。

我希望這至少更接近您的需求。

SELECT
  imgId,
  tName,
  imgWidth,
  imgHeight
FROM (
        SELECT imgId, 'Primary' tName, imgHeight, imgWidth
        FROM primary_images WHERE imgId=$imgId
        UNION 
        SELECT imgId, 'Secondary' tName, imgHeight, imgWidth
        FROM secondary_images WHERE primaryId=$imgId
      ) as T
WHERE 
 (T.imgHeight >= (SELECT MAX(imgHeight) FROM primary_images)
  AND
  T.imgHeight >= (SELECT MAX(imgHeight) FROM secondary_images)
 )
 OR
 (T.imgWidth >= (SELECT MAX(imgWidth) FROM primary_images)
  AND
  T.imgWidth >= (SELECT MAX(imgWidth) FROM secondary_images)
 )

-下面的原始答案-

嘗試這樣的事情:

   SELECT
      imgId,
      tName,
      MAX(imgWidth) maxWidth,
      MAX(imgHeight) maxHeight FROM (
        SELECT imgId, 'Primary' tName, imgHeight, imgWidth
        FROM primary_images WHERE imgId=$imgId
        UNION 
        SELECT imgId, 'Secondary' tName, imgHeight, imgWidth
        FROM secondary_images WHERE primaryId=$imgId
      ) as T
   GROUP BY imgId, tName;

(對於派生表,MaxHeight並不是很好的別名,因為它不是最大高度的表。我將其更改為T。)

這是到目前為止我得到的。 它看起來(可能是)次優。 不過,我主要將其發布是為了介紹總體思路。 希望有人可以開發它,以使結果更有效:

SELECT
  m.maxWidth,
  m.maxHeight,
  (u.imgWidth IS NOT NULL) AS OneImageHasBoth
FROM (
  SELECT
    MAX(imgWidth)  AS maxWidth,
    MAX(imgHeight) AS maxHeight
  FROM (
    SELECT imgWidth, imgHeight
    FROM primary_images
    UNION
    SELECT imgWidth, imgHeight
    FROM secondary_images
  ) u
) m
  LEFT JOIN  (
    SELECT imgWidth, imgHeight
    FROM primary_images
    UNION
    SELECT imgWidth, imgHeight
    FROM secondary_images
  ) u ON m.maxWidth = u.imgWidth AND m.maxHeight = u.imgHeight

顯然,一種優化方法是將重復並集的結果存儲到臨時表中。 我不確定您的特定環境是否允許您發出多語句查詢,但是如果可以,那肯定會有助於加快查詢速度。

您想要分別找到每個表的結果,然后將它們組合起來的想法實際上還不錯。 但我認為合並結果的邏輯應該更復雜一些。 一個明顯的例子是,一張表的結果包含true ,而另一張false但后者具有更大的寬度和高度,因此返回true將是不正確的。 或考慮以下示例:

假設primary_images的結果是

maxWidth  maxHeight  OneImageHasBoth
--------  ---------  ---------------
1152      864        true

對於secondary_images

maxWidth  maxHeight  OneImageHasBoth
--------  ---------  ---------------
1280      800        true

兩個表都具有兩個屬性都最大的圖像,但是很顯然,如果將查詢應用於聯合集,則OneImageHasBoth將為false

因此,如您所見,將兩個結果相結合應該比僅僅依賴其中之一存在true更為復雜。

這是我實現該方法的嘗試:

SELECT
  CASE WHEN p.maxWidth  > s.maxWidth  THEN p.maxWidth  ELSE s.maxWidth  END AS maxWidth,
  CASE WHEN p.maxHeight > s.maxHeight THEN p.maxHeight ELSE s.maxHeight END AS maxHeight,
  (
    p.maxWidth >= s.maxWidth AND p.maxHeight >= s.maxHeight AND p.OneImageHasBoth OR
    p.maxWidth <= s.maxWidth AND p.maxHeight <= s.maxHeight AND s.OneImageHasBoth
  ) AS OneImageHasBoth
FROM (
  SELECT DISTINCT
    m.maxWidth,  m.maxHeight,
    (i.imgWidth IS NOT NULL) AS OneImageHasBoth
  FROM (
    SELECT
      MAX(imgWidth)  AS maxWidth,
      MAX(imgHeight) AS maxHeight
    FROM primary_images
  ) m
    LEFT JOIN primary_images i ON m.maxWidth = i.imgWidth AND m.maxHeight = i.imgHeight
) p
CROSS JOIN (
  SELECT DISTINCT
    m.maxWidth,  m.maxHeight,
    (i.imgWidth IS NOT NULL) AS OneImageHasBoth
  FROM (
    SELECT
      MAX(imgWidth)  AS maxWidth,
      MAX(imgHeight) AS maxHeight
    FROM secondary_images
  ) m
    LEFT JOIN secondary_images i ON m.maxWidth = i.imgWidth AND m.maxHeight = i.imgHeight
) s

您可以在兩個查詢中執行此操作,以這種方式讀取可能更容易。 第一個查詢是獲得最大高度和最大寬度所必須獲得的。

然后,您可以發出第二個查詢,如下所示:

SElECT primaryId FROM (
   SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION 
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) as union_table
WHERE imgWidth = [maxWidth] and imgHeight = [maxHeight];

其中[maxWidth][maxHeight]是您從上一個查詢中獲得的兩個值。 如果它們屬於相同的圖像ID,則查詢結果將大於零,否則,查詢將沒有結果。

如果您需要知道哪個ID屬於哪個表,則可以創建人工列(例如源),查詢將變為:

SElECT primaryId, source FROM (
   SELECT imgHeight, imgWidth, imgId AS primaryId, 1 as source FROM primary_images
    UNION 
    SELECT imgHeight, imgWidth, primaryId, 2 as source FROM secondary_images
) as union_table
WHERE imgWidth = [maxWidth] and imgHeight = [maxHeight];

請注意,現在有一個名為source的人工列。 因此,如果您的查詢結果是

primaryId     source
4             1 
4             2
5             2

你知道imgId 4從primary_images以及primaryId 4,5從secondary_images比賽與之前的查詢的最大高度和最大寬度

最后,如果您只是想知道是否存在匹配的圖像,請按照下面的評論和討論進行:

SElECT count(*) AS imgCount FROM (
   SELECT imgHeight, imgWidth, imgId AS primaryId FROM primary_images
    UNION ALL
    SELECT imgHeight, imgWidth, primaryId FROM secondary_images
) as union_table
WHERE primaryId = $imgId and imgWidth = [maxWidth] and imgHeight = [maxHeight];

如果沒有匹配的圖像,則imgCount將為零,否則為零

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM