我有一张代理权表,与地区,国家,地区,城市,行业,专业,行业,专业和次专业有着多对多的关系。
与办公室和联系人之间也存在一对多的关系。
基本上我想要做的是创建一个显示这些表中特定记录的结果表。
我已经在表中的每个外键上创建了索引。这是我的问题:
SELECT agencies.agency,
agencies.website_url,
agencies.status,
agencies.SIZE,
agencies.id,
officedata.id,
contactdata.name,
contactdata.surname,
contactdata.job_title,
contactdata.email,
contactdata.mobile
FROM agencies
LEFT JOIN (SELECT agencies_industries.agency_id,
agencies_industries.industry_id
FROM agencies_industries) AS industrydata
ON agencies.id = industrydata.agency_id
LEFT JOIN (SELECT agencies_professions.agency_id,
agencies_professions.profession_id
FROM agencies_professions) AS professiondata
ON agencies.id = professiondata.agency_id
LEFT JOIN (SELECT agencies_sectors.agency_id,
agencies_sectors.sector_id
FROM agencies_sectors) AS sectordata
ON agencies.id = sectordata.agency_id
LEFT JOIN (SELECT agencies_seniorities.agency_id,
agencies_seniorities.seniority_id
FROM agencies_seniorities) AS senioritydata
ON agencies.id = senioritydata.agency_id
LEFT JOIN (SELECT agencies_zones.agency_id,
agencies_zones.zone_id
FROM agencies_zones) AS zonesdata
ON agencies.id = zonesdata.agency_id
LEFT JOIN (SELECT agencies_countries.agency_id,
agencies_countries.country_id
FROM agencies_countries) AS countrydata
ON agencies.id = countrydata.agency_id
LEFT JOIN (SELECT agencies_regions.agency_id,
agencies_regions.region_id
FROM agencies_regions) AS regiondata
ON agencies.id = regiondata.agency_id
LEFT JOIN (SELECT agencies_cities.agency_id,
agencies_cities.city_id
FROM agencies_cities) AS citydata
ON agencies.id = citydata.agency_id
LEFT JOIN (SELECT agencies_specialisms.agency_id,
agencies_specialisms.specialism_id
FROM agencies_specialisms) AS specialismdata
ON agencies.id = specialismdata.agency_id
LEFT JOIN (SELECT agencies_sub_specialisms.agency_id,
gencies_sub_specialisms.sub_specialism_id
FROM agencies_sub_specialisms) AS subdata
ON agencies.id = subdata.agency_id
LEFT JOIN (SELECT offices.id,
offices.agency_id,
offices.hq
FROM offices
WHERE offices.hq = "1") AS officedata
ON agencies.id = officedata.agency_id
LEFT JOIN (SELECT contacts.name,
contacts.surname,
contacts.agency_id,
contacts.job_title,
contacts.email,
contacts.mobile
FROM contacts) AS contactdata
ON agencies.id = contactdata.agency_id
执行时,网站加载并加载,5分钟后崩溃。我不知道为什么需要这么长时间。在phpMyAdmin的过程中,它说“复制到tmp表”。在终止此进程后,站点将完成加载错误。有时在执行此查询后,整个phpMyAdmin无效。
你知道如何让它正常工作吗?
在数据库中,每个表中只有大约20行或更少的行。另外,当最后使用伪数据提供WHERE子句时,查询将在10秒内执行,显示无结果。当我提供仅适合一个结果的数据时,它会在大约20秒内执行。
好的抱歉我接受的答案太快了,因为我没有解释为什么我需要离开加入那些在我之前的例子中没有使用的表格。
重点是我也需要它们才能被使用,因为所有这些都是一个搜索系统 - 有人想搜索一个区域是非洲的代理商 - 在结果中它没有显示但是需要选择它
当我将查询更改为:
SELECT agencies.agency
,agencies.website_url
,agencies.STATUS
,agencies.size
,agencies.id
,agencies.status
,OfficeData.id
,ContactData.name
,ContactData.surname
,ContactData.job_title
,ContactData.email
,ContactData.mobile
FROM agencies
LEFT JOIN offices AS OfficeData ON agencies.id = OfficeData.agency_id
AND OfficeData.hq = "1"
LEFT JOIN contacts AS ContactData ON agencies.id = ContactData.agency_id
LEFT JOIN agencies_professions AS ProfessionData ON agencies.id = ProfessionData.agency_id
LEFT JOIN agencies_seniorities AS SeniorityData ON agencies.id = SeniorityData.agency_id
LEFT JOIN agencies_sectors AS SectorData ON agencies.id = SectorData.agency_id
LEFT JOIN agencies_countries AS CountryData ON agencies.id = CountryData.agency_id
LEFT JOIN agencies_regions AS RegionData ON agencies.id = RegionData.agency_id
LEFT JOIN agencies_sub_specialisms AS SubData ON agencies.id = SubData.agency_id
LEFT JOIN agencies_cities AS CityData ON agencies.id = CityData.agency_id
LEFT JOIN agencies_zones AS ZoneData ON agencies.id = ZoneData.agency_id
LEFT JOIN agencies_specialisms AS SpecialismData ON agencies.id = SpecialismData.agency_id
LEFT JOIN agencies_industries AS IndustryData ON agencies.id = IndustryData.agency_id
它仍然会加载,直到崩溃服务器。
在流程中,它现在说“发送数据”
答案 0 :(得分:8)
您的查询有两个问题。 1)有许多不必要的子选择。 2)您从未从中选择数据的表格左键加入。
请改为尝试:
SELECT agencies.agency
,agencies.website_url
,agencies.STATUS
,agencies.size
,agencies.id
,OfficeData.id
,ContactData.NAME
,ContactData.surname
,ContactData.job_title
,ContactData.email
,ContactData.mobile
FROM agencies
LEFT JOIN offices AS OfficeData ON agencies.id = OfficeData.agency_id
AND OfficeData.hq = "1"
LEFT JOIN contacts AS ContactData ON agencies.id = ContactData.agency_id
答案 1 :(得分:3)
经过一番讨论后,我认为这可行:
SELECT A.agency, A.website_url, A.status, A.size,
A.id, O.id, C.name, C.surname,
C.job_title, C.email, C.mobile
FROM agencies A
LEFT JOIN offices O ON (A.id = O.agency_id)
LEFT JOIN contacts C ON (A.id = C.agency_id)
WHERE O.hq = '1'
AND A.id IN (
SELECT agency_id FROM agencies_industries WHERE <criteria for industries>
UNION SELECT agency_id FROM agencies_professions WHERE <criteria for professions>
UNION SELECT agency_id FROM agencies_sectors WHERE <criteria for sectors>
UNION SELECT agency_id FROM agencies_seniorities WHERE <criteria for seniorities>
UNION SELECT agency_id FROM agencies_zones WHERE <criteria for zones>
UNION SELECT agency_id FROM agencies_countries WHERE <criteria for countries>
UNION SELECT agency_id FROM agencies_regions WHERE <criteria for regions>
UNION SELECT agency_id FROM agencies_cities WHERE <criteria for cities>
UNION SELECT agency_id FROM agencies_specialisms WHERE <criteria for specialisms>
UNION SELECT agency_id FROM agencies_sub_specialisms WHERE <criteria for sub_specialisms>);
您需要将每个替换为您的搜索条件。
如果您想动态插入条件,可以使用虚拟错误条件或符合插入标准,例如:
SELECT A.agency, A.website_url, A.status, A.size,
A.id, O.id, C.name, C.surname,
C.job_title, C.email, C.mobile
FROM agencies A
LEFT JOIN offices O ON (A.id = O.agency_id)
LEFT JOIN contacts C ON (A.id = C.agency_id)
WHERE O.hq = '1'
AND A.id IN (
SELECT agency_id FROM agencies_industries WHERE 0 = 1 OR (<criteria for industries>)
UNION SELECT agency_id FROM agencies_professions WHERE 0 = 1 OR (<criteria for professions>)
UNION SELECT agency_id FROM agencies_sectors WHERE 0 = 1 OR (<criteria for sectors>)
UNION SELECT agency_id FROM agencies_seniorities WHERE 0 = 1 OR (<criteria for seniorities>)
UNION SELECT agency_id FROM agencies_zones WHERE 0 = 1 OR (<criteria for zones>)
UNION SELECT agency_id FROM agencies_countries WHERE 0 = 1 OR (<criteria for countries>)
UNION SELECT agency_id FROM agencies_regions WHERE 0 = 1 OR (<criteria for regions>)
UNION SELECT agency_id FROM agencies_cities WHERE 0 = 1 OR (<criteria for cities>)
UNION SELECT agency_id FROM agencies_specialisms WHERE 0 = 1 OR (<criteria for specialisms>)
UNION SELECT agency_id FROM agencies_sub_specialisms WHERE 0 = 1 OR (<criteria for sub_specialisms>));