2010-08-18 81 views
0
SELECT a.id,i.* FROM ads a 
    INNER JOIN images i ON i.ad_id=a.id 
     GROUP BY a.id 
      LIMIT 10 

無法弄清楚,如何選擇圖像與標誌「主」內的圖像表。與聲明MySQL問題

對於一個a.id最多可以在圖像表中的3張照片中,這3張照片中的一張可以有一個字段main = 1。我需要挑選照片通過優先級,其中標誌主要設置爲1

CREATE DATABASE IF NOT EXISTS `test123`; 
USE `test123`; 

CREATE TABLE IF NOT EXISTS `ads` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=229 DEFAULT CHARSET=utf8; 

INSERT INTO `ads` (`id`) VALUES (217), (225), (226), (228); 

CREATE TABLE IF NOT EXISTS `images` (
    `image_id` int(10) NOT NULL AUTO_INCREMENT, 
    `ad_id` int(10) DEFAULT '0', 
    `main` int(10) DEFAULT '0', 
    `t_0` varchar(255) DEFAULT '0', 
    `t_1` varchar(255) DEFAULT '0', 
    `t_8` varchar(255) DEFAULT '0', 
    PRIMARY KEY (`image_id`), 
    KEY `ad_id` (`ad_id`), 
    KEY `t_0` (`t_0`), 
    KEY `t_1` (`t_1`), 
    KEY `t_8` (`t_8`), 
    KEY `main` (`main`) 
) ENGINE=MyISAM AUTO_INCREMENT=425 DEFAULT CHARSET=utf8; 


INSERT INTO `images` (`image_id`, `ad_id`, `main`, `t_0`, `t_1`, `t_8`) VALUES 
(1, 226, 0, 'img_link1', 'img_link2', 'img_link3'), 
(2, 228, 0, 'img_link1', 'img_link2', 'img_link3'), 
(3, 225, 0, 'img_link1', 'img_link2', 'img_link3'), 
(4, 217, 0, 'img_link1', 'img_link2', 'img_link3'), 
(5, 217, 1, 'img_link1', 'img_link2', 'img_link3'), 
(6, 217, 0, 'img_link1', 'img_link2', 'img_link3'); 

類似的東西,但每ads.id只有1排

SELECT a.id, i.main AS main 
    FROM images i 
     LEFT JOIN ads a ON a.id=i.ad_id 
      WHERE i.main=1 OR i.main=0 

輸出要求:

 
id | main | links 
217 | 1 | ... 
225 | 0 | ... 
226 | 0 | ... 
228 | 0 | ... 
+0

你需要返回每'a.id'只有一個郵件圖像或與主一個所有三個圖像第一? – Quassnoi 2010-08-18 14:43:57

+0

只有一個圖像,最好將主標記設置爲1 – Somebody 2010-08-18 14:46:39

回答

1

這應該做的伎倆

select ad_id, main, concat(t_0, ', ', t_1, ', ', t_8) as links 
from images 
where main = 0 
group by ad_id having ad_id not in (select ad_id from images where main = 1) 
union all 
select ad_id, main, concat(t_0, ', ', t_1, ', ', t_8) as links from images where main = 1 
+0

選擇一個圖像與主標誌的所有圖像,而不是每一個。因此,舉例來說,如果有主標記的圖像更多,則只會選取一個。 – Somebody 2010-08-18 17:44:35

+1

我已修改查詢檢查出來 – 2010-08-18 18:49:29

+0

heh nice one 是的,我得到了提示。 它的工作:) – Somebody 2010-08-18 19:22:25

0

我認爲這應該工作:

SELECT a.id,i.* FROM ads a 
INNER JOIN images i 
ON i.ad_id=a.id 
WHERE i.main=1   
GROUP BY a.id 
LIMIT 10 

編輯:我想你也可能下降GROUP BY子句則一樣會有一個之間的1對1映射和我

+0

只返回一行,main = 1 – Somebody 2010-08-18 14:49:26

+0

如果顯示樣本輸入和輸出,它可能會有所幫助。 (例如,廣告具有這些字段和行,圖像具有這些字段和行,我希望從兩個表的連接返回此輸出。) – Kendrick 2010-08-18 14:53:10

0

你不要在這裏都需要一組:

SELECT ads.id,images.* 
    FROM ads 
     INNER JOIN images ON(Images.ad_id=ads.id) 
    WHERE Images.Flag=x 
    ORDER BY ads.id 
    LIMIT 10 

如果您想要在沒有標記的情況下包含沒有標記的圖像,或者即使多個圖像具有該標記,每個廣告只返回1個圖像,查詢也會更加困難。你必須澄清才能得到更有針對性的答案。

編輯:像這樣的東西可能會奏效

SELECT mainImages.Ad_ID2, 
     IFNULL(mainImages.T_0,images.T_0) as T0, 
     IFNULL(mainImages.T_1,images.T_1) as T1 
    FROM images 
     inner join 
      (SELECT ads.id as Ad_ID2,images.* 
       FROM ads 
        LEFT OUTER JOIN images ON(Images.ad_id=ads.id) 
       WHERE Images.Main=1) as mainImages 
      on images.Ad_ID=mainImages.Ad_ID2 
    ORDER BY mainImages.Ad_ID2 
    LIMIT 10 

它使用子查詢一起創造和圖像數據(僅在主標誌設置)ID的列表,然後再重新加入圖像表和如果它沒有存在於子查詢中,則填充來自新連接的空圖像數據。正如我所說,我無法在這裏測試它,但我認爲一般概念是合理的。

編輯:修復了使用更新後表格的問題。

編輯:改變列名作爲根據註釋

+0

即使主標誌沒有設置爲1,查詢也應該選擇圖像。 標記僅用於一個目的,指向應顯示在主頁面上的主照片。 順便說一句,如果我不會按廣告ID分組,那麼有一個廣告ID返回多行。 – Somebody 2010-08-18 14:56:53

+0

您將不得不使用子查詢,因爲您正在比較表中的行值。我會給它一個鏡頭,但我沒有工作的MySql實例來測試它... – Kendrick 2010-08-18 14:58:48

+0

@Beck「查詢應選擇圖像,即使它們沒有將主標記設置爲1」 但是,您只是說:「只有一個圖像,最好將主標記設置爲1」o_O – 2010-08-18 15:06:30