我遇到以下问题。
我正在做一些"简单"过滤。我从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
答案 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