感谢您的关注。一整晚都在努力,但没有结果。我对mySQL很陌生。
请告诉我,它是否经过适当的构造和优化:
SELECT *
FROM (
(`tbl_projects`
LEFT JOIN `tbl_files`
ON ((`file_isforType` = 1) AND `file_isforID`=`proj_uid`) )
INNER JOIN `tbl_users`
ON `proj_InitiatorUsrID` = `usr_UID` )
ORDER BY `file_uid` DESC LIMIT 0 , 15我在上面使用了“解释”,发现它没有对第一个表table_projects使用任何键。
我把截图放那儿了

下一个是数据库的概念。任何用户都可以发布任意数量的项目,每个项目都有自己的图片(0..x)
项目可能也有附加的文件。可能有1或部分或可能没有。
joint是下一个:项目innerjoin用户左转文件
我从这个rq得到了什么:
proj1 | user1 | photo1
proj1 | user1 | photo2
proj1 | user1 | photo3
proj2 | user1 | photo4
proj2 | user1 | photo5
proj3 | user2 | photo6
proj4 | user1 | null
proj5 | user1 | photo7
proj5 | user1 | photo8
proj6 | user2 | null因此,从上到下,我的php脚本表单从上到下逐个进入html项目列表。有些人没有照片。有些人有一个。有些有2,3,4..etc。
proj1 - user1 - 3 photos
proj2 - user1 - 2 photos
proj3 - user2 - 1 photo
proj4 - user1 - no photos
proj5 - user1 - 2 photos
etctable_files是在下一个逻辑中构建的:
file_uid | file_ownerID | file_isforType| file_isforID
file_uid PRIMARY AI
file_ownerID reference to PRIMARY at table_users
file_isforType- smallint 1..9
indicates type of THING which this file was attached to.
eg
1 = _TheProject as project photo
2 = _TheUserProfile as users photo
3 = _TheMessage as attachment
file_ResourceID - unique id of that very thing, whose type specified in file_isforType.例如
if (file_isWhatfor=_TheProject) AND (file_ResourceID=3) ->> to the proj#3
if (file_isWhatfor=_TheUserProfile) AND (file_ResourceID=3) ->> to the user#3
if (file_isWhatfor=_TheMessage) AND (file_ResourceID=3) ->> to the msg#3发布于 2019-01-08 04:17:04
我们不可能知道这是否是“优化”的,因为这需要知道比你告诉我们的更多。稍后再讨论这个问题。
虽然MySQL确实允许在标识中使用backticks,但是除非标识包含一个空格或一个保留字,否则使用它并不是强制性的。所需要的是在列名前加上它们的表名,或者使用表别名。这是强烈建议的(即“最佳实践”),这样您就可以始终知道哪一列来自哪个表。注意,我必须猜测在下面的所有联接中使用哪个表别名,它们可能需要更正。
SELECT
*
FROM tbl_projects AS p
LEFT JOIN tbl_files AS f ON p.proj_uid = f.file_isforID AND f.file_isforType = 1
INNER JOIN tbl_users AS u ON p.proj_InitiatorUsrID = u.usr_UID
ORDER BY f.file_uid DESC
LIMIT 0 , 15还请注意,您使用的所有括号都是完全多余的,可以安全地删除。
为了进一步“优化”,我建议您不要使用select *。指定您需要的列,这可以提高结果传输的速度,但不一定会对查询执行产生任何可测量的影响。除此之外,您需要在所有连接中涉及的所有列上索引,并且可以通过使用explain plan来研究是否缺少索引。请参阅8.8.1使用EXPLAIN优化查询
如果缺少索引,请考虑将其添加到解释标识的表中。
https://stackoverflow.com/questions/54084903
复制相似问题