#mysql #sql
Вопрос:
Я разрабатываю веб-сайт, который служит связующим звеном между людьми, ищущими донорство крови для своих близких, и добровольными донорами крови.
Для того чтобы зарегистрированный донор крови назначил встречу для сдачи крови, он должен сначала открыть «Страницу запросов на кровь», где он может найти пациентов, которым он может сделать пожертвование.
Я хочу, чтобы на странице были показаны запросы на донорство крови, которые:
- Донор не назначил встречу для пожертвования
- у них еще не назначено никаких назначений на сдачу крови.
Это моя первая таблица: требования к донорству крови. Все запросы на донорство крови, сделанные пользователями на сайте, будут отправляться сюда (идентификатор покупателя относится к идентификатору пользователя пользователя, который сделал запрос на донорство крови для пациента).
| Name | Type | Collation | Null | Default |
| ----------------| -------------- |--------------------|------|---------|
| patientID (FK) | int(11) | | | |
| acquirerID (FK) | int(11) | | | |
| requestID (PK) | varchar(255) | utf8mb4_general_ci | No | None |
| datePosted | date | | No | None |
| approved |tinyint(1) | | No | 0 |
| archived |tinyint(1) | | No | 0 |
Вот моя вторая таблица, tblappointments. Именно сюда будут отправляться все записи, сделанные зарегистрированными донорами сайта
| Name | Type |Collation |Null |Default| Extra|
|---------------------|------------|-------------------|--------|-------|--------|
| id (PK) |int(11) | | No | None |AUTO_INCREMENT
| healthCenterID (FK) |int(11) | | No | None |
|donorID (FK) |int(11) | | No | None |
|patientID (FK) |int(11) | | No | None |
|donationRequestID(FK)|varchar(255)|utf8mb4_general_ci | No | None |
|apptDate |date | | No | None |
|timeSlotID (FK) |int(11) | | No | None |
|confirmed |tinyint(1) | | No | 0 |
|completed |tinyint(1) | | No | 0 |
Это первый запрос, который я попробовал
SELECT request.patientID FROM blooddonationrequest as request
LEFT JOIN tblappointment as appt ON appt.donationRequestID = request.requestID
WHERE appt.donationRequestID IS NULL
Он успешно возвращает все запросы на донорство крови, у которых нет запланированных встреч, но как насчет запросов на донорство крови, у которых уже запланированы встречи с другими донорами, но не с донором, который в данный момент вошел в систему? Вот с чем я борюсь
Я сделал много проб и ошибок с кодом SQL, который мне не удалось записать и сохранить, но в основном это просто модификации вышеприведенного SQL. Я отчаянно пытался включить в запрос что-то вроде and appt.donorID != $_SESSION['userID']
, но, конечно, это не сработало.
Итак, какие запросы я должен использовать?
Ответ №1:
Ваша модель и ваш запрос были мне не очень понятны — мне пришлось прочитать их 5 раз, чтобы попытаться понять, что у вас было и о чем вы просите. Позвольте мне попробовать воспроизвести это для вас, чтобы увидеть, понимаю ли я это.
У вас есть список пациентов (идентификатор пациента), которые либо просят о донорстве крови, либо просили кого-то другого (идентификатор покупателя) от их имени. У вас есть второй список назначений доноров, которые были сопоставлены с запросом в первой таблице. По какой-то причине вы храните ссылку на запрос и ссылку на пациента в одной таблице, которая не очень нормализована и может привести к некоторым аномалиям данных.
Вы хотели бы найти всех пациентов, у которых есть невыполненный запрос, но которые еще не записаны на прием.
Если бы это было указано таким образом, я бы объединил две таблицы не по запросу, а по идентификатору пациента и искал бы нули.
Select R.PatientID From blooddonationrequests R Left Outer Join tblappointments A
On R.PatientID=A.PatientID
Where A.PatientID Is Null
Поскольку ваша модель позволяет одному и тому же пациенту запрашивать пожертвования несколько раз, вам может потребоваться сгруппировать их вместе, если вам нужен только один пациент один раз.
Комментарии:
1. Спасибо, этот запрос фактически не показывает запросы на сдачу крови, у которых уже назначена встреча. Я хочу, чтобы на странице отображались запросы на сдачу крови, для которых текущий Зарегистрированный донор еще не записался на прием. Это означает, что в запросе на донорство крови уже может быть назначена встреча донором А, но если Донор В входит в систему и еще не назначил встречу для этого запроса, указанный запрос все равно должен быть виден на странице.