powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите с заспросом.
8 сообщений из 8, страница 1 из 1
помогите с заспросом.
    #33089385
mr_Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имеется БД с такое структурой:

Таблица Human
HumanID int(10)
HumanName varchar(100)
HumanPhone varchar(100)
HumanEmail varchar(128)
Description text
Age int(2)
Tall int(3)
Weight int(3)
HairTypeID int(10)
EyeColorID int(10)
CityID int(10)
UserID int(10)
IsApproved enum('yes', 'no')
SortOrder tinyint(4)
AtFirstPage enum('yes', 'no')
AddDate date

Таблица Cities
CityID int(10)
CityName varchar(50)
SortOrder tinyint(4)

Таблица Pics
PicID int(10)
HumanID int(10)
PicName varchar(100)
PicFileName varchar(255)
MimeType varchar(20)
IsApproved enum('yes', 'no')
SortOrder tinyint(4)

Таблица Human и Pics связаны по полю HumanID.
Необходимо выбрать из Human записи с соответствующими записями из Pics, чтоб каждой записи из Human соответствовала только одна из Pics. Если в Pics нету соответствия то NULL. В Pics может быть несколько соответствующих записей. Если их несколько то выбирается только одна.

Я написал запрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SELECT
                                h.HumanID AS HumanID,
                                h.HumanName AS HumanName,
                                h.HumanPhone AS HumanPhone,
                                h.HumanEmail AS HumanEmail,
                                h.Description AS Description,
                                h.Age AS Age,
                                h.Tall AS Tall,
                                h.Weight AS Weight,
                                DATE_FORMAT(h.AddDate,'%d/%m/%Y') AS AddDate,
                                c.CityName AS CityName,
                                c.CityID AS CityID,
                                p.PicID
                          FROM
                                Human AS h
                          INNER JOIN
                                Cities AS c
                          ON
                                c.CityID=h.CityID
                          LEFT OUTER JOIN
                          	(
                          	    SELECT
                          	    	PicID,
                          	    	HumanID,
                          	    	PicName,
                          	    	PicFileName
                          	    FROM
                          	    	Pics
                          	    WHERE
                          	    	Pics.IsApproved='yes'
                          	    ORDER BY
                          	    	SortOrder DESC
                          	    LIMIT
                          	    	 1 
                          	) AS p
                          ON
                                p.HumanID=h.HumanID
                          WHERE
                                h.IsApproved='yes' AND
                                h.AtFirstPage='yes'
                          ORDER BY
                                h.AddDate DESC

Вот только соответствующие записи из Pics (вложенный INNER JOIN) как-то непонятно срабатывает. Если LIMIT убрать то соответствующие выбираются правильно (но мне нужна только одна), если ставлю, то все записи выбранные из Human кроме одной получают соответствие из Pics равное NULL.

Подскажите, плиз, где что у меня неправильно.

И если кто знает подскажите как можно из вложенного запроса сослаться на поля из внешнего запроса? Я хотел поставить в INNER JOIN таблице соответствие h.HumanID=p.HumanID, но MySQL ругается матом, и говорит что объект не найден. Как можно решить эту задачку также?
...
Рейтинг: 0 / 0
помогите с заспросом.
    #33089396
matveyb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так должно работать, в MSSQL работает.



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
SELECT
                                h.HumanID AS HumanID,
                                h.HumanName AS HumanName,
                                h.HumanPhone AS HumanPhone,
                                h.HumanEmail AS HumanEmail,
                                h.Description AS Description,
                                h.Age AS Age,
                                h.Tall AS Tall,
                                h.Weight AS Weight,
                                DATE_FORMAT(h.AddDate,'%d/%m/%Y') AS AddDate,
                                c.CityName AS CityName,
                                c.CityID AS CityID,
                                (
                          	    SELECT
                          	    	PicID,
                          	    	HumanID,
                          	    	PicName,
                          	    	PicFileName
                          	    FROM
                          	    	Pics
                          	    WHERE
                          	    	Pics.IsApproved='yes' AND Pics.HumanID=h.HumanID
                          	    ORDER BY
                          	    	SortOrder DESC
                          	    LIMIT
                          	    	 1 
                          	) as PicID
                          FROM
                                Human AS h
                          INNER JOIN
                                Cities AS c
                          ON
                                c.CityID=h.CityID
                         
                          WHERE
                                h.IsApproved='yes' AND
                                h.AtFirstPage='yes'
                          ORDER BY
                                h.AddDate DESC
...
Рейтинг: 0 / 0
помогите с заспросом.
    #33089399
Matvey B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибочка вышла. Так правильнее


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
SELECT
                                h.HumanID AS HumanID,
                                h.HumanName AS HumanName,
                                h.HumanPhone AS HumanPhone,
                                h.HumanEmail AS HumanEmail,
                                h.Description AS Description,
                                h.Age AS Age,
                                h.Tall AS Tall,
                                h.Weight AS Weight,
                                DATE_FORMAT(h.AddDate,'%d/%m/%Y') AS AddDate,
                                c.CityName AS CityName,
                                c.CityID AS CityID,
                                (
                          	    SELECT
                          	    	PicID
                          	    FROM
                          	    	Pics
                          	    WHERE
                          	    	Pics.IsApproved='yes' AND Pics.HumanID=h.HumanID
                          	    ORDER BY
                          	    	SortOrder DESC
                          	    LIMIT
                          	    	 1 
                          	) as PicID
                          FROM
                                Human AS h
                          INNER JOIN
                                Cities AS c
                          ON
                                c.CityID=h.CityID
                         
                          WHERE
                                h.IsApproved='yes' AND
                                h.AtFirstPage='yes'
                          ORDER BY
                                h.AddDate DESC
...
Рейтинг: 0 / 0
помогите с заспросом.
    #33089506
mr_Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не получается. я так пробовал, но все равно пишет: таблица h не найдена.
Как из подзапроса установить связь с внешним запросом - вот в чем проблемма.

Как сделать, помогите плиз!!!
...
Рейтинг: 0 / 0
помогите с заспросом.
    #33089511
mr_Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MySQL 4.1.10 у меня стоит. по-моему должен быть метод решения.
...
Рейтинг: 0 / 0
помогите с заспросом.
    #33089519
Matvey B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я в MySQL не писал, но в SQL синтаксис такой

Код: plaintext
1.
2.
3.
4.
FROM
                                Human h
                          INNER JOIN
                                Cities c

, а не

Код: plaintext
1.
2.
3.
4.
FROM
                                Human AS h
                          INNER JOIN
                                Cities AS c
...
Рейтинг: 0 / 0
помогите с заспросом.
    #33090363
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Matvey BЯ в MySQL не писал, но в SQL синтаксис такой

Код: plaintext
1.
2.
3.
4.
FROM
                                Human h
                          INNER JOIN
                                Cities c

, а не

Код: plaintext
1.
2.
3.
4.
FROM
                                Human AS h
                          INNER JOIN
                                Cities AS c


Это гон. Ибо в стандарте
Код: plaintext
Human [AS] h
...
Рейтинг: 0 / 0
помогите с заспросом.
    #33090582
Ekshibarov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так попробуй:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SELECT
                                h.HumanID AS HumanID,
                                h.HumanName AS HumanName,
                                h.HumanPhone AS HumanPhone,
                                h.HumanEmail AS HumanEmail,
                                h.Description AS Description,
                                h.Age AS Age,
                                h.Tall AS Tall,
                                h.Weight AS Weight,
                                DATE_FORMAT(h.AddDate,'%d/%m/%Y') AS AddDate,
                                c.CityName AS CityName,
                                c.CityID AS CityID,
                                p.PicID
                          FROM
                                Human AS h
                          INNER JOIN
                                Cities AS c
                          ON
                                c.CityID=h.CityID
                          LEFT JOIN Pics as P ON 
                               (P.HumanID = h.HumanID and P.IsApproved='yes')
                          WHERE
                                h.IsApproved='yes' AND
                                h.AtFirstPage='yes'
                          GROUP BY 
                                h.HumanID
                          ORDER BY
                                h.AddDate DESC
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите с заспросом.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]