我有以下“图片”表格......
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和更多的条款我已经使用但没有运气一些帮助可能...
提前致谢。
答案 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%'