eine dieser Abfragen Versuchen:
SELECT a.phone_no
FROM admission a
JOIN users u on a.phone_no LIKE concat(u.phone_no, '__')
WHERE u.phone_no REGEXP '^(99)+[0-9]+$'
oder
SELECT a.phone_no
FROM admission a
JOIN users u on a.phone_no REGEXP concat('^', u.phone_no, '[0-9]{2}$')
WHERE u.phone_no REGEXP '^(99)+[0-9]+$'
Wenn die Anzahl der "nachlauf Ziffern" nicht festgelegt ist, können Sie auch:
LIKE concat(u.phone_no, '%')
oder
REGEXP concat('^', u.phone_no, '[0-9]*$')
In diesem Fall müssen Sie jedoch möglicherweise SELECT DISTICT a.phone_no
verwenden, wenn es möglich ist, dass eine eine Untersequenz einer anderen ist (z. 99123 und 991234).
aktualisieren
Nach ein paar Tests mit 10K Zeilen für Benutzer-Tabelle ausgeführt und 100K Zeilen für die Zulassung Tabelle i auf die folgende Abfrage kam:
SELECT a.phone_no
FROM admission a
JOIN users u
ON a.phone_no >= u.phone_no
AND a.phone_no < CONCAT(u.phone_no, 'z')
AND a.phone_no LIKE CONCAT(u.phone_no, '%')
AND a.phone_no REGEXP CONCAT('^', u.phone_no, '[0-9]*$')
WHERE u.phone_no LIKE '99%'
AND u.phone_no REGEXP '^(99)+[0-9]*$'
UNION SELECT 0 FROM (SELECT 0) dummy WHERE 0
fiddle
Auf diese Weise können Sie Verwenden Sie REGEXP
und immer noch eine großartige Leistung. Diese Abfrage wird in meinem Testfall fast sofort ausgeführt.
Logischerweise brauchen Sie nur die Bedingungen REGEXP. Bei größeren Tabellen könnte die Abfrage jedoch eine Zeitüberschreitung aufweisen. Wenn Sie eine LIKE-Bedingung verwenden, wird die Ergebnismenge vor der REGEXP-Prüfung gefiltert. Aber selbst mit LIKE funktioniert die Abfrage nicht sehr gut. Aus irgendeinem Grund verwendet MySQL keine Bereichsüberprüfung für den Join. So fügte ich eine explizite Bereichsprüfung:
ON a.phone_no >= u.phone_no
AND a.phone_no < CONCAT(u.phone_no, 'z')
Damit können Sie überprüfen die LIKE-Bedingung von dem Teil JOIN entfernen.
Der UNION-Teil ist ein Ersatz für DISTICT. MySQL scheint DISTINCT in eine GROUP BY-Anweisung zu übersetzen, die nicht gut funktioniert. Wenn ich UNION mit einer leeren Ergebnismenge verwende, zwinge ich MySQL, Duplikate nach dem SELECT zu entfernen. Sie können diese Zeile entfernen, wenn Sie eine feste Anzahl nachkommender Ziffern verwenden.
Sie können die REGEXP Muster an Ihre Bedürfnisse anpassen:
...
AND a.phone_no REGEXP CONCAT('^', u.phone_no, '[0-9]{2}$')
...
AND u.phone_no REGEXP '^(99)+[0-9]{8}$'
...
Wenn Sie nur REGEXP brauchen die Länge des PHONE_NO zu überprüfen, können Sie auch eine LIKE-Bedingung mit dem ‚_‘ Platzhalter verwenden können.
AND a.phone_no LIKE CONCAT(u.phone_no, '__')
...
AND u.phone_no LIKE '99________$'
oder kombinieren Sie eine LIKE-Bedingung mit einer STR_LENGTH-Prüfung.
Was meinst du genau, von "hat das gleiche Muster"? Raten Sie von Ihren Beispielen, ist es tatsächlich "beginnt mit"? – Bohemian
Die Tabelle für den Benutzer und die Tabelle für den Zugang haben beide die gleichen Telefonnummern, die mit 99 beginnen, aber die Tabelle des Benutzers fehlt nach 2 Ziffern. Zuerst möchte ich alle diese Nummern aus der Tabelle '^ [99] + [0-9] {8}' filtern und dann die Telefonnummer 9912678 des Benutzers mit der Telefonnummer 991267823 der Telefonnummer – shuvrow
übereinstimmen, wenn ich Daten für die so formatierte Tabelle des Benutzers abfrage '9912678 | 9912323 | 9912366' die Abfrage wird ausgeführt, aber ich weiß nicht, wie ich das machen soll. Danke – shuvrow