长期的听众,第一次打电话的人。
我正在创建一个界面,允许我将所有的运河与英国的一个地区相关联,我需要数据库返回所有运河的列表。如果渠道位于我正在编辑的区域中,则此清单还必须包含渠道ID和桥接表ID。
(我会向你展示它的样子,但显然我作为一个新手只能看到两张图片)
相关表格如下:
canals表: id,name,description等regions表:同上regions_canals表: id,left_id (region),right_id (canal)
在本例中,我正在编辑西米德兰兹郡(region 6)的水渠。我希望MySQL返回所有渠道的列表,并指明某条渠道是否已被指定为位于西米德兰兹郡。
我希望得到这样的结果:

(是的,我知道牛津大学不在西米德兰兹),但我实际得到的是:

在这个例子中,我得到了双Llangollen,牛津和什罗普郡联合渠道。我需要去掉多余的通道,但不是那些对应于区域(left_id) 6的通道。
有人建议这应该是可行的:
SELECT regions_canals.id AS bridge_id, regions.id AS left_id, regions.name AS region_name, canals.id AS right_id, canals.name AS canal_name
FROM canals
LEFT JOIN regions_canals ON regions_canals.right_id = canals.id
LEFT JOIN regions ON regions_canals.left_id = regions.id
GROUP BY canals.id
ORDER BY canal_name;但这会导致以下MySQL错误消息:
#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'nbb.regions_canals.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by这几乎是可行的:
SELECT canals.id, canals.name, IF(
canals.id IN
(SELECT canals.id
FROM canals
JOIN regions_canals ON regions_canals.right_id = canals.id
JOIN regions ON regions_canals.left_id = regions.id
WHERE regions.id = 6), true, false)
AS region from canals
ORDER BY canals.name;我可以说出西米德兰兹郡有哪些运河,但它不包括bridge_id,如果我想从一个地区(如西米德兰兹)移除一条运河(如牛津),我就需要它。
发布于 2016-06-21 13:25:52
请参考下面的链接,其中包含类似类型的示例- http://www.databasejournal.com/features/mysql/article.php/3911786/Eliminating-Duplicate-Rows-from-MySQL-Result-Sets.htm
https://stackoverflow.com/questions/37935941
复制相似问题