我正试图访问共享一个公共"SpeciesName"字段的两个表中的数据。
表"coords"是一个非常大的数据集,有5500多个条目,表本身大约有26个字段。此表的唯一ID是矩阵编号,从0-5500开始,每行包含稍微唯一的数据。但是,存在多个具有相同"SpeciesName"的行-表中只有446个唯一的"SpeciesNames"。
表"common"存储每个"SpeciesNames"的通用名称和图像数据,其中包含3个字段。基本上,我想做的是使用"SpeciesNames"作为外键在两个表之间建立MySQL关系,并在一个查询中访问这两个表的数据。
从哪里开始?谷歌搜索已经产生了处理包含一个或两个字段的表的结果。但是,当我进行查询时,我希望从PHP中的BOTH表中选择ALL字段。任何关于这方面的建议都将是美妙的。
编辑:我知道目前的数据不多,但会的!我本应该更清楚的。这是"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`)
我基本上是用坐标在地图上绘制每条记录,并显示"坐标"中的所有信息——这已经成功实现了。表"common"包含为每个"SpeciesName"(coords.SpeciesName和common.ID)动态创建的新信息,因此我想显示CommonName,并将"ImageUrl"answers"UploadedImgUrl"与我以前拥有的数据一起使用。我还是MySQL的一个新手,所以如果我的术语不完美,我很抱歉!
MYSQL的主要问题不是数据库大小或记录数!我见过高达10-12 GB的数据库文件。主要问题可能发生在您想要获取记录的时候,并且您可能会面临一次可以处理的查询数量的问题!如果您在执行查询时注意,就不会出现严重的问题。
您正在寻找的是数据库规范化。其基本思想是避免表中存在冗余数据,而只保留您引用的单个值(在您的情况下为SpeciesNames)。
因此,您可以将引用存储为存储common.ID
的coords.SpeciesName_id
,而不是coords.SpeciesName
,它包含与common.CommonName
相同的字符串。这两个字段的类型都应该是INT
,因为它们的比较速度比字符串快得多。
要在一个查询中从两个表中获取数据,可以执行以下操作:
SELECT * FROM coords JOIN common ON coords.SpeciesName_id = common.ID
例如,在谷歌上快速搜索就会得到这篇关于规范化的介绍。
另一个PHP MySQL搜索教程将为您提供如何使用PHP执行查询的提示。