通过优先考虑Jpg over Doc,每个产品只检索一个文件

时间:2015-08-11 02:26:52

标签: mysql arrays

我有以下“图片”表格......

Id  Idu idA Doc_pic Doc_cont    Doc_name    Doc_type
1   1   1   yes     no          a.jpg       jpg
1   1   1   no      yes         b_doc.jpg   Doc
3   1   2   yes     no          c.jpg       Jpg
4   1   2   no      yes         D_doc.jpg   Doc
5   1   3   yes     no          e.jpg       Jpg
6   1   3   yes     no          f.jpg       Jpg
7   1   3   no      yes         G_doc.jpg   Doc
8   2   5   no      yes         F_doc.jpg   Doc
9   3   6   yes     no          h.jpg       Jpg
10  3   8   yes     no          j.jpg       Jpg
11  4   4   no      yes         K_doc.jpg   Doc
12  4   4   no      yes         L_doc.jpg   Doc
13  4   4   yes     no          m.jpg       Jpg
14  4   9   yes     no          n.jpg       Jpg

如你所见,我有三个标识符,id,idu和ida

id - 是表格图像的主要ID。 idu - 是放置图像的用户。 ida - 是来自另一个表的产品ID,其中包含与之关联的图像和文档。

如何为每个产品展示仅Doc_type = jpg,只有一个,如果没有像id = 8那样可用,则显示doc。

查询后我想要的输出应该是......

1   1   1   yes no  a.jpg   jpg
3   1   2   yes no  c.jpg   Jpg
5   1   3   yes no  e.jpg   Jpg
8   2   5   no  yes F_doc.jpg   Doc
9   3   6   yes no  h.jpg   Jpg
10  3   8   yes no  j.jpg   Jpg
13  4   4   yes no  m.jpg   Jpg
14  4   9   yes no  n.jpg   Jpg

我已经尝试了所有可能的方法在mysql select,distinct,group by和更多的条款我已经使用但没有运气一些帮助可能...

提前致谢。

4 个答案:

答案 0 :(得分:1)

一种方法是使用以下查询:

SELECT *
FROM image
GROUP BY idA
ORDER BY Doc_type DESC

另:

SELECT IF(Doc_type LIKE 'jpg', 1, 2) sortOrder, *
FROM image
GROUP BY idA
ORDER BY sortOrder

或者您甚至可以将IF语句直接移到ORDER BY子句中。

最适合你的是什么。

答案 1 :(得分:1)

这是实现目标的一种方式:

SELECT
     COALESCE( jpg_images.`Id`       ,doc_images.`Id`       ,0  ) AS Id
    ,COALESCE( jpg_images.`Idu`      ,doc_images.`Idu`      ,0  ) AS Idu
    ,COALESCE( jpg_images.`idA`      ,doc_images.`idA`      ,0  ) AS idA
    ,COALESCE( jpg_images.`Doc_pic`  ,doc_images.`Doc_pic`  ,'' ) AS Doc_pic
    ,COALESCE( jpg_images.`Doc_cont` ,doc_images.`Doc_cont` ,'' ) AS Doc_cont
    ,COALESCE( jpg_images.`Doc_name` ,doc_images.`Doc_name` ,'' ) AS Doc_name
    ,COALESCE( jpg_images.`Doc_type` ,doc_images.`Doc_type` ,'' ) AS Doc_type
FROM
    ( SELECT DISTINCT idA FROM image ) idA_list

    LEFT OUTER JOIN
        (
            SELECT
                *
            FROM
                image
            WHERE
                Doc_type = 'jpg'
            GROUP BY idA
        )
        jpg_images ON jpg_images.idA = idA_list.idA

    LEFT OUTER JOIN
        (
            SELECT
                *
            FROM
                image
            WHERE
                Doc_type = 'doc'
            GROUP BY idA
        )
        doc_images ON doc_images.idA = idA_list.idA

在大桌子上可能会很贵。

使用下表进行测试:

-- --------------------------------------------------------

--
-- Table structure for table `image`
--

CREATE TABLE IF NOT EXISTS `image` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Idu` int(11) NOT NULL,
  `idA` int(11) NOT NULL,
  `Doc_pic` varchar(10) NOT NULL,
  `Doc_cont` varchar(10) NOT NULL,
  `Doc_name` varchar(20) NOT NULL,
  `Doc_type` varchar(20) NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

--
-- Dumping data for table `image`
--

INSERT INTO `image` (`Id`, `Idu`, `idA`, `Doc_pic`, `Doc_cont`, `Doc_name`, `Doc_type`) VALUES
(1, 1, 1, 'yes', 'no', 'a.jpg', 'jpg'),
(3, 1, 2, 'yes', 'no', 'c.jpg', 'Jpg'),
(4, 1, 2, 'no', 'yes', 'D_doc.jpg', 'Doc'),
(5, 1, 3, 'yes', 'no', 'e.jpg', 'Jpg'),
(6, 1, 3, 'yes', 'no', 'f.jpg', 'Jpg'),
(7, 1, 3, 'no', 'yes', 'G_doc.jpg', 'Doc'),
(8, 2, 5, 'no', 'yes', 'F_doc.jpg', 'Doc'),
(9, 3, 6, 'yes', 'no', 'h.jpg', 'Jpg'),
(10, 3, 8, 'yes', 'no', 'j.jpg', 'Jpg'),
(11, 4, 4, 'no', 'yes', 'K_doc.jpg', 'Doc'),
(12, 4, 4, 'no', 'yes', 'L_doc.jpg', 'Doc'),
(13, 4, 4, 'yes', 'no', 'm.jpg', 'Jpg'),
(14, 4, 9, 'yes', 'no', 'n.jpg', 'Jpg');

答案 2 :(得分:1)

实现目标的一种方法:

SELECT
    image.*
FROM
    ( SELECT DISTINCT idA FROM image ) idA_list

    LEFT OUTER JOIN
        (
            SELECT
                Id ,idA
            FROM
                image
            WHERE
                Doc_type = 'jpg'
            GROUP BY idA
        )
        jpg_images ON jpg_images.idA = idA_list.idA

    LEFT OUTER JOIN
        (
            SELECT
                Id ,idA
            FROM
                image
            WHERE
                Doc_type = 'doc'
            GROUP BY idA
        )
        doc_images ON doc_images.idA = idA_list.idA

    LEFT OUTER JOIN
        image ON image.id = COALESCE( jpg_images.id ,doc_images.id )

答案 3 :(得分:0)

SELECT * FROM image WHERE Doc_name LIKE '%.jpg%'

这是示例:http://www.w3schools.com/sql/sql_like.asp