我正在尝试从两个共享一个共同的“物种名称”的表中访问数据。领域。
表' coords'是一个非常大的数据集,有超过5500个条目,表本身有大约26个字段。此表的唯一ID是矩阵编号,其运行范围为0-5500,每行包含略微唯一的数据。有多个行具有相同的' SpeciesName'但是 - 只有446个唯一的' SpeciesNames'在表内。
表'常见'存储每个' SpeciesNames'的通用名称和图像数据。有3个字段。基本上我要做的是使用' SpeciesNames'在两个表之间建立一个MySQL关系。作为外键并在一个查询中访问两者的数据。
从哪里开始?谷歌搜索已经产生了处理包含一个或两个字段的表的结果。但是当我查询时,我想从PHP中的BOTH表中选择所有字段。对此有任何建议都很棒。
编辑: 我知道目前数据并不大,但它会是!我应该更清楚这一点。这是' coords':
`Authors` varchar(500) DEFAULT NULL,
`Journal` varchar(500) DEFAULT NULL,
`YearPublication` varchar(500) DEFAULT NULL,
`DOIISBN` varchar(500) DEFAULT NULL,
`AdditionalSource` varchar(500) DEFAULT NULL,
`Ecoregion` varchar(500) DEFAULT NULL,
`GrowthType` varchar(500) DEFAULT NULL,
`GrowthFormRaunkiaer` varchar(500) DEFAULT NULL,
`NumberPopulations` varchar(500) DEFAULT NULL,
`AnnualPeriodicity` varchar(500) DEFAULT NULL,
`CriteriaSize` varchar(500) DEFAULT NULL,
`CriteriaOntogeny` varchar(500) DEFAULT NULL,
`CriteriaAge` varchar(500) DEFAULT NULL,
`Kingdom` varchar(500) DEFAULT NULL,
`Phylum` varchar(500) DEFAULT NULL,
`AngioGymno` varchar(500) DEFAULT NULL,
`DicotMonoc` varchar(500) DEFAULT NULL,
`Class` varchar(500) DEFAULT NULL,
`_Order` varchar(500) DEFAULT NULL,
`Family` varchar(500) DEFAULT NULL,
`Genus` varchar(500) DEFAULT NULL,
`SpeciesName` varchar(500) DEFAULT 'NA',
`EnteredBy` varchar(500) DEFAULT NULL,
`EnteredDate` varchar(500) DEFAULT NULL,
`Source` varchar(500) DEFAULT NULL,
`SpeciesAuthor` varchar(500) DEFAULT NULL,
`StudiedSex` varchar(500) DEFAULT NULL,
`MatrixComposite` varchar(500) DEFAULT NULL,
`MatrixTreatment` varchar(500) DEFAULT NULL,
`MatrixCaptivity` varchar(500) DEFAULT NULL,
`MatrixStartYear` varchar(500) DEFAULT NULL,
`MatrixStartSeason` varchar(500) DEFAULT NULL,
`MatrixStartMonth` varchar(500) DEFAULT NULL,
`MatrixEndYear` varchar(500) DEFAULT NULL,
`MatrixEndSeason` varchar(500) DEFAULT NULL,
`MatrixEndMonth` varchar(500) DEFAULT NULL,
`Population` varchar(500) DEFAULT NULL,
`LatDeg` varchar(500) DEFAULT NULL,
`LatMin` varchar(500) DEFAULT NULL,
`LatSec` varchar(500) DEFAULT NULL,
`LonDeg` varchar(500) DEFAULT NULL,
`LonMin` varchar(500) DEFAULT NULL,
`LonSec` varchar(500) DEFAULT NULL,
`LatitudeDec` varchar(500) DEFAULT NULL,
`LongitudeDec` varchar(500) DEFAULT NULL,
`Altitude` varchar(500) DEFAULT NULL,
`Country` varchar(500) DEFAULT NULL,
`Continent` varchar(500) DEFAULT NULL,
`MatrixSplit` varchar(500) DEFAULT NULL,
`Observation` varchar(500) DEFAULT NULL,
`MatrixClassOrganized` varchar(500) DEFAULT NULL,
`Matrixnumber` varchar(500) NOT NULL DEFAULT '',
`MatrixClassNumber` varchar(500) DEFAULT NULL,
`Dimension` varchar(500) DEFAULT NULL,
`plantType` varchar(500) DEFAULT NULL,
`matrix` varchar(15000) DEFAULT NULL,
`_ClassNames` varchar(16000) DEFAULT NULL,
`StatusStudy` varchar(500) DEFAULT NULL,
`StatusStudyRef` varchar(500) DEFAULT NULL,
`StatusElsewhere` varchar(500) DEFAULT NULL,
`StatusElsewhereRef` varchar(500) DEFAULT NULL,
PRIMARY KEY (`Matrixnumber`),
'普通':
`ID` varchar(100) NOT NULL,
`CommonName` varchar(100) NOT NULL,
`ImageUrl` varchar(200) NOT NULL,
`UploadImgUrl` varchar(100) NOT NULL,
UNIQUE KEY `SpeciesAccepted` (`ID`),
KEY `ID` (`ID`)
我基本上使用坐标在地图上绘制每条记录并显示来自& coords的所有信息 - 这已经成功实现。表'常见'包含为每个' SpeciesName'动态创建的新信息。 (coords.SpeciesName和common.ID),所以我想显示CommonName并使用' ImageUrl'和' UploadedImgUrl'除了我以前的数据。我还是MySQL的新手,所以如果我的术语不完美,我会道歉!
答案 0 :(得分:0)
您要找的是database normalization。基本思想是避免在表中使用冗余数据,而只保留您引用的单个值(在您的情况下为SpeciesNames)。
因此,您不会将coords.SpeciesName
包含与common.CommonName
相同的字符串,而是存储coords.SpeciesName_id
的引用,该引用存储common.ID
。对于性能调整,这两个字段都应该是INT
类型,因为它们可以比字符串更快地进行比较。
要在单个查询中从两个表中获取数据,您可以执行以下操作:
SELECT * FROM coords JOIN common ON coords.SpeciesName_id = common.ID
例如,快速搜索谷歌会产生此intro to normalization。
对PHP MySQL tutorial的另一次搜索将为您提供有关如何使用PHP执行查询的提示。
答案 1 :(得分:0)
MYSQL的主要问题不是数据库大小或记录号!我见过最多10-12 GB的数据库文件。当您想要获取记录时,我遇到的主要问题是您可能会遇到一次可以处理的查询数量问题!如果你按照执行查询的方式注意,不会发生严重的问题。