Я считаю себя достаточно компетентным в понимании и манипулировании Си-иш языками; Для меня не проблема придумать алгоритм и реализовать его на любом языке Си.
У меня огромные трудности с написанием запросов SQL (в моем конкретном случае MySQL). Для очень простых запросов это не проблема, но для сложных запросов я расстраиваюсь, не зная, с чего начать. Чтение документации MySQL затруднено, главным образом из-за отсутствия описания и объяснения синтаксиса. t организован очень хорошо.
Например, документация SELECT
повсюду: она начинается с того, что выглядит как psuedo-BNF, но затем (поскольку текст для сводных описаний не доступен для кликов ... например, select_expr
) он быстро превращается в это разочаровывающее упражнение, пытаясь самостоятельно собрать синтаксис, открыв несколько окон браузера.
Хватит ныть.
Я хотел бы знать, как люди, шаг постепенно приступайте к построению сложного запроса MySQL. Вот конкретный пример. У меня есть три таблицы ниже. Я хочу ВЫБРАТЬ
набор строк со следующими характеристиками:
Из таблиц userInfo
и userProgram
я хочу выбрать userName
, одобрено
, и поля ModifiedTimestamp
и UNION
их в один набор. Из этого набора я хочу ЗАКАЗАТЬ
с помощью ModifiedTimestamp
, взяв MAX (modifiedTimestamp)
для каждого пользователя (т.е. должна быть только одна строка с уникальным userName
и временная метка, связанная с этим именем пользователя, должны быть как можно более высокими).
Из таблицы user
я хочу сопоставить firstName
и lastName
, который связан с userName
, поэтому он выглядит примерно так:
+-----------+----------+----------+-------------------+
| firstName | lastName | userName | modifiedTimestamp |
+-----------+----------+----------+-------------------+
| JJ | Prof | jjprofUs | 1289914725 |
| User | 2 | user2 | 1289914722 |
| User | 1 | user1 | 1289914716 |
| User | 3 | user3 | 1289914713 |
| User | 4 | user4 | 1289914712 |
| User | 5 | user5 | 1289914711 |
+-----------+----------+----------+-------------------+
Ближайший запрос, который у меня есть, - это такой запрос:
(SELECT firstName, lastName, user.userName, modifiedTimestamp
FROM user, userInfo
WHERE user.userName=userInfo.userName)
UNION
(SELECT firstName, lastName, user.userName, modifiedTimestamp
FROM user, userProgram
WHERE user.userName=userProgram.userName)
ORDER BY modifiedTimestamp DESC;
Я чувствую себя симпатичным близко, но я не знаю, куда идти дальше, и даже если я правильно об этом думаю.
> user
+--------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| userName | char(8) | NO | PRI | NULL | |
| firstName | varchar(255) | NO | | NULL | |
| lastName | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | UNI | NULL | |
| avatar | varchar(255) | YES | | '' | |
| password | varchar(255) | NO | | NULL | |
| passwordHint | text | YES | | NULL | |
| access | int(11) | NO | | 1 | |
| lastLoginTimestamp | int(11) | NO | | -1 | |
| isActive | tinyint(4) | NO | | 1 | |
+--------------------+--------------+------+-----+---------+-------+
> userInfo
+-------------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+------------+------+-----+---------+-------+
| userName | char(8) | NO | MUL | NULL | |
| isApproved | tinyint(4) | NO | | 0 | |
| modifiedTimestamp | int(11) | NO | | NULL | |
| field | char(255) | YES | | NULL | |
| value | text | YES | | NULL | |
+-------------------+------------+------+-----+---------+-------+
> userProgram
+-------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| userName | char(8) | NO | PRI | NULL | |
| isApproved | tinyint(4) | NO | PRI | 0 | |
| modifiedTimestamp | int(11) | NO | | NULL | |
| name | varchar(255) | YES | | NULL | |
| address1 | varchar(255) | YES | | NULL | |
| address2 | varchar(255) | YES | | NULL | |
| city | varchar(50) | YES | | NULL | |
| state | char(2) | YES | MUL | NULL | |
| zip | char(10) | YES | | NULL | |
| phone | varchar(25) | YES | | NULL | |
| fax | varchar(25) | YES | | NULL | |
| ehsChildren | int(11) | YES | | NULL | |
| hsChildren | int(11) | YES | | NULL | |
| siteCount | int(11) | YES | | NULL | |
| staffCount | int(11) | YES | | NULL | |
| grantee | varchar(255) | YES | | NULL | |
| programType | varchar(255) | YES | | NULL | |
| additional | text | YES | | NULL | |
+-------------------+--------------+------+-----+---------+-------+