简体   繁体   中英

SQL Query based on multiple where conditions

I've got a script where checked in employee's can see the stock inventory from each other, linked with their personal stock location, so each checked in employee can see which items are in stock at different locations. However, I want the main stock (id of 1 , which is not attached to an employee) to be showed always, but I can't get the query right because one of the where statements is clearly not correct:

`stock_locations`.`location_id` = 1 AND 
`workschedule`.`checkedIn` = 1 AND 

Rememeber, the main stock is not linked to an employee, so it doesn't show up at the workschedule table. If I remove the first statement, It clearly shows up all the checked in employee's with their location, but that doesn't give me the main stock. If I remove the second statement, it only shows me the main stock.

How can I solve this issue within SQL? This is btw the full statement:

SELECT
    `item_quantities`.`item_id`,
    `stock_locations`.`location_name`,
    `item_quantities`.`quantity`,
    `people`.`first_name`
FROM
    `item_quantities`
JOIN `stock_locations` ON `item_quantities`.`location_id` = `stock_locations`.`location_id`
JOIN `items` ON `item_quantities`.`item_id` = `items`.`item_id`
LEFT JOIN `workschedule` ON `workschedule`.`linked_storage` = `stock_locations`.`location_id`
LEFT JOIN `people` ON `workschedule`.`employee_id` = `people`.`person_id`
WHERE
    `stock_locations`.`location_id` = 1 AND 
    `workschedule`.`checkedIn` = 0 AND 
    `items`.`unit_price` != 0 AND 
    `items`.`deleted` = 0 AND 
    `stock_locations`.`deleted` = 0 NULL

Thanks in advance!

Make it an OR statement inside of parens.

 (`stock_locations`.`location_id` = 1 OR `workschedule`.`checkedIn` = 1) AND

This will return all records that match either the main stock or the employee.

You need to use the OR operator. Clearly both things can't happen at the same time, so you need to specify each set of acceptable conditions.

SELECT
    `item_quantities`.`item_id`,
    `stock_locations`.`location_name`,
    `item_quantities`.`quantity`,
    `people`.`first_name`
FROM
  `item_quantities`
  JOIN `stock_locations` 
    ON `item_quantities`.`location_id` = `stock_locations`.`location_id`
  JOIN `items` 
    ON `item_quantities`.`item_id` = `items`.`item_id`
  LEFT JOIN `workschedule` 
    ON `workschedule`.`linked_storage` = `stock_locations`.`location_id`
  LEFT JOIN `people` 
    ON `workschedule`.`employee_id` = `people`.`person_id`
WHERE
    `stock_locations`.`location_id`  = 1 
    OR (
      AND `workschedule`.`checkedIn`   = 1
      AND `items`.`unit_price`        != 0 
      AND `items`.`deleted`            = 0 
      AND `stock_locations`.`deleted`  = 0 
      NULL
    )

You have LEFT JOIN , but your WHERE clause turns them into inner joins. Fixing that will probably fix your problem:

SELECT . . .
FROM item_quantities iq JOIN
     stock_locations sl
     ON iq.`location_id` = sl.`location_id` JOIN
     items i
     ON iq.`item_id` = i.`item_id` LEFT JOIN
     workschedule ws
     ON ws.`linked_storage` = sl.`location_id` AND
        ws.`checkedIn` = 0 LEFT JOIN
--------^
     people p
     ON ws.`employee_id` = p.`person_id`
WHERE sl.`location_id` = 1 AND 
      i.`unit_price` != 0 AND 
      i.`deleted` = 0 AND 
      sl.`deleted` = 0

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM