根据其他表

时间:2017-07-25 14:49:48

标签: mysql sql-order-by

我收到了一个查询,我希望根据另一个数据库对结果进行排序。

这是我的疑问:

SELECT    a.`name`
FROM      `article` AS a
LEFT JOIN `container` AS b
       ON b.`id` = a.`container`
WHERE     a.`container` = '1'
ORDER BY  b.`sort` ASC;

这很好用,但它总是对结果进行排序。 Bute我想根据容器表中的值对ist进行排序。

Article table

id | container | name    | gender
---|---------------------|---------
1  | 1         | Michael | male
2  | 1         | Joe     | male
3  | 2         | Karen   | female
4  | 2         | Andrew  | male
5  | 3         | Jessica | female


Container table

id | sort   | order
---|--------|----
 1 | name   | asc
 2 | name   | desc
 3 | gender | asc
 4 | name   | asc
 5 | gender | desc

如何更改查询以从容器表中获取订单?

我希望这个结果:

id | container | name    | gender
---|---------------------|---------
2  | 1         | Joe     | male
1  | 1         | Michael | male

2 个答案:

答案 0 :(得分:1)

您不能在一个查询中执行此操作。

在准备查询时,必须在执行开始之前修复给定的SQL查询。根据执行时发现的数据,您无法更改行为。

您必须在一个查询中读取排序方向,然后使用您发现的值格式化动态SQL查询。

import cv2
import numpy as np

img = cv2.imread("digitbox.jpg", 0)

_, thresh = cv2.threshold(img, 200, 255, cv2.THRESH_BINARY)
_, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

mask = np.ones_like(img) * 255
boxes = []

for contour in contours:
    if cv2.contourArea(contour) > 100:
        hull = cv2.convexHull(contour)
        cv2.drawContours(mask, [hull], -1, 0, -1)
        x,y,w,h = cv2.boundingRect(contour)
        boxes.append((x,y,w,h))

boxes = sorted(boxes, key=lambda box: box[0])

mask = cv2.dilate(mask, np.ones((5,5),np.uint8))

img[mask != 0] = 255

result = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

for n,box in enumerate(boxes):
    x,y,w,h = box
    cv2.rectangle(result,(x,y),(x+w,y+h),(255,0,0),2)
    cv2.putText(result, str(n),(x+5,y+17), cv2.FONT_HERSHEY_SIMPLEX, 0.6,(255,0,0),2,cv2.LINE_AA)

cv2.imwrite('digitbox_result.png', result)

将这些数据提取到SELECT `sort`, `order` FROM container WHERE id = 1 $sort_column等应用变量中。然后使用它们:

$direction

(我假设变量的PHP语法,但你可以用任何语言做类似的事情。)

答案 1 :(得分:0)

这样的事情有用吗?

ORDER BY CASE WHEN b.`order` = 'ASC' b.`sort` ELSE -b.`sort` END;

如果没有,请提供一些样本数据和该数据的预期结果,以便我们更好地了解您的要求。