选择外表中存在的行至少N次?

时间:2018-02-15 13:36:22

标签: sql join

我遇到以下问题。

我正在做一些"简单"过滤。我从1-100提交了一个最小值。

主表:

CREATE TABLE `materials` (
  `id` int(11) NOT NULL,
  `materialNr` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `active` tinyint(4) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

别名表:

CREATE TABLE `materialsAliases` (
  `id` int(11) NOT NULL,
  `materialsId` int(11) NOT NULL,
  `aliasName` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `materialStandard` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

我想从材质表中选择别名表中有N个别名的所有材料。并非所有材料都有别名,因为materialAliases表中没有条目。有些材料有很多别名,然后放在meterialAliases表中,并从meterialAliases.materialsId链接到materials.id。

到目前为止我尝试了什么(只是忽略其他连接):

SELECT 
    materials.`active`, 
    materials.`id`, 
    materials.`materialNr`,
    materialDescriptionsDe.`description`,
    materialDescriptionsEn.`description`,
FROM `materials`

LEFT JOIN materialDescriptionsDe
ON `materials`.id=materialDescriptionsDe.`materialsId`

LEFT JOIN materialDescriptionsEn
ON `materials`.id=materialDescriptionsEn.`materialsId`

LEFT JOIN materialsAliases
ON `materials`.id=materialsAliases.`materialsId`

WHERE `materialNr` LIKE ? 

ORDER BY materials.`id` DESC

LIMIT 25

2 个答案:

答案 0 :(得分:1)

您需要使用LEFT JOIN,GROUP BY和HAVING COUNT:

SELECT materials.id, materials.materialNr
FROM materials
LEFT JOIN materialsAliases ON materials.id = materialsAliases.materialsId
WHERE materialNr LIKE ? 
GROUP BY materials.id, materials.materialNr
HAVING COUNT(materialsAliases.id) >= ? -- this is your N
ORDER BY materials.id DESC

您可以从select和group by子句中删除materials.materialNr,最终得到一个只返回materials.id的查询。然后,您可以将结果提供给更复杂的查询。

答案 1 :(得分:0)

我没有清楚地理解你的目的,我希望你把'#34;预期的输出"在你的问题中有一些样本数据。我仍然相信使用下面的INNER连接将帮助您查看仅具有至少一个别名的此类材料:

SELECT 
    materials.active, 
    materials.id, 
    materials.materialNr,
    materialDescriptionsDe.description,
    materialDescriptionsEn.description,
FROM materials m
INNER JOIN materialsAliases ma ON m.id=ma.materialsId
ORDER BY m.Id DESC